5

Tôi đang sử dụng tiện ích con ngày hôm nay cho iOS8 để hiển thị thông tin có liên quan đến ngày hiện tại. Vấn đề là tôi không muốn hiển thị các widget/phần ở tất cả nếu không có tin nhắn có liên quan để hiển thị.Cách ẩn Tiện ích con ngày hôm nay của iOS 8 khi không có gì để hiển thị?

Tôi biết điều đó phải có thể khi ứng dụng BA thực hiện nó (nó chỉ hiển thị tiện ích khi có chuyến bay, phần còn lại của thời gian không hiển thị). Tôi không thể tìm ra cách để đạt được hành vi này.

Có ai biết cách thực hiện điều này không?

Trả lời

12

Tôi đã tìm ra cách để thực hiện việc này là sử dụng NCWidgetController. Điều này cho phép bạn dễ dàng chỉ định thời điểm tiện ích ngày hôm nay sẽ được hiển thị dựa trên bất kỳ tiêu chí nào bạn thấy phù hợp.

Chỉ cần thêm đoạn mã sau vào phương pháp viewDidLoad của bạn (hoặc bất cứ nơi nào mà sẽ được gọi khi load lại widget) trong bộ điều khiển xem tiện ích con hôm nay và nó sẽ làm việc:

BOOL hasDataToDisplay = NO; 

NCWidgetController *widgetController = [NCWidgetController widgetController]; 
[widgetController setHasContent:hasDataToDisplay forWidgetWithBundleIdentifier:@"com.my-company.my-app.my-widget"]; 

của Apple Documents:https://developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetController_Class/index.html#//apple_ref/occ/cl/NCWidgetController

CẢNH BÁO: Không thể đặt lại số NCWidgetController từ chính tiện ích con khi bạn đã đặt không có nội dung để hiển thị. Nói cách khác một khi bạn đặt nó là NO thì sẽ không quay trở lại trừ khi bạn kích hoạt nó từ ứng dụng mẹ/chứa.

+0

hi, tahnks cho câu trả lời siêu, nhưng câu hỏi xin vui lòng cho ghi chú này: "Các NCWidgetController không thể được thiết lập lại từ các widget riêng của mình sau khi đã đặt không có nội dung để hiển thị. Nói cách khác một khi bạn đặt nó thành NO thì sẽ không quay trở lại trừ khi bạn kích hoạt nó từ ứng dụng cha/có chứa."Làm thế nào tôi có thể" kích hoạt nó từ cha mẹ/có chứa ứng dụng. "Tôi đã không có bạn rất tốt, bạn có thể cho tôi ví dụ? nhờ vậy mush – Rawan

-1

Đó là sử dụng tốt hơn

+ (instancetype)widgetController 

sau đó gọi

- (void)setHasContent:(BOOL)flag forWidgetWithBundleIdentifier:(NSString *)bundleID 
+0

Tại sao bạn nghĩ rằng đó là tốt hơn? – defense2000x

+0

@ defense2000x bởi vì đó là tài liệu tại https : //developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetController_Class/index.html#//apple_ref/occ/clm/NCWidgetController/widgetController – jeeeyul

3

Trong phương pháp viewDidLoad ViewController của của widget thêm như sau:

BOOL DisplayWidget = NO; 
[[NCWidgetController widgetController] setHasContent:DisplayWidget 
         forWidgetWithBundleIdentifier:@"<widget's bunder identifier>"]; 

này sẽ vô hiệu hóa các widget hiển thị.

Để bật lại tính năng này, bạn phải thực hiện điều đó từ ứng dụng có chứa bằng cách sử dụng cùng một dòng để chuyển YES sang tham số setHasContent. Hãy chắc chắn rằng để thêm hàng nhập khẩu cần thiết để ứng dụng có chứa trong ViewController mà sẽ kích hoạt lại các widget:

#import <NotificationCenter/NotificationCenter.h> 

@interface ViewController() <NCWidgetProviding> {...} 

[Kiểm tra trang 41 của tài liệu dành cho các widget https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf]

0

Phương pháp mà tôi đã qua sử dụng, mặc dù không hoàn hảo và có một dân sót nhỏ trong Notification Center, nhưng làm việc cho tôi:

trong viewDidLoad() thiết lập chiều cao kích thước nội dung ưa thích để 1:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view from its nib. 
    preferredContentSize = CGSizeMake(0, 1) 
    view.setNeedsLayout() 
} 
.210

sau đó khi cập nhật widget, được chiều cao thực tế và thiết lập nó:

var data: NSData? 

func updateData() { 
    // fetch data 
    if let data = data { 
     let viewHeight: CGFloat 
     // UI preperation and initialize viewHeight var 
     preferredContentSize = CGSizeMake(0, viewHeight); 
    } else { 
     preferredContentSize = CGSizeMake(0, 1); 
    } 

} 

func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) { 
    // Perform any setup necessary in order to update the view. 

    // If an error is encountered, use NCUpdateResult.Failed 
    // If there's no update required, use NCUpdateResult.NoData 
    // If there's an update, use NCUpdateResult.NewData 

    updateData() 

    completionHandler(data != nil ? NCUpdateResult.NewData : NCUpdateResult.NoData) 
} 
Các vấn đề liên quan