現在の日付に関連する情報を表示するために、iOS8 の今日のウィジェットを使用しています。問題は、表示する関連メッセージがない場合、ウィジェット/セクションをまったく表示したくないことです。
BAアプリが行うように、それが可能でなければならないことを私は知っています(フライトがある場合にのみウィジェットを表示し、それ以外の時間はまったく表示されません). この動作を実現する方法がわかりません。
これを行う方法を知っている人はいますか?
現在の日付に関連する情報を表示するために、iOS8 の今日のウィジェットを使用しています。問題は、表示する関連メッセージがない場合、ウィジェット/セクションをまったく表示したくないことです。
BAアプリが行うように、それが可能でなければならないことを私は知っています(フライトがある場合にのみウィジェットを表示し、それ以外の時間はまったく表示されません). この動作を実現する方法がわかりません。
これを行う方法を知っている人はいますか?
これを行う方法は、を使用することであることがわかりましたNCWidgetController
。これにより、適切と思われる基準に基づいて、今日のウィジェットをいつ表示するかを簡単に指定できます。
viewDidLoad
今日のウィジェット ビュー コントローラーのメソッド (またはウィジェットのリロード時に呼び出される任意の場所)に以下を追加するだけで機能します。
BOOL hasDataToDisplay = NO;
NCWidgetController *widgetController = [NCWidgetController widgetController];
[widgetController setHasContent:hasDataToDisplay forWidgetWithBundleIdentifier:@"com.my-company.my-app.my-widget"];
警告:表示するコンテンツがないと設定すると、ウィジェット自体から をリセットすることはNCWidgetController
できません。つまり、一度設定するとNO
、親/包含アプリからトリガーしない限り、元に戻すことはできません。
ウィジェットの ViewController の viewDidLoad メソッドに以下を追加します。
BOOL DisplayWidget = NO;
[[NCWidgetController widgetController] setHasContent:DisplayWidget
forWidgetWithBundleIdentifier:@"<widget's bunder identifier>"];
これにより、ウィジェットが表示されなくなります。
再度有効にするには、含まれているアプリから同じ行を使用して YES を setHasContent パラメーターに渡す必要があります。ウィジェットを再度有効にする ViewController で、含まれているアプリに必要なインポートを必ず追加してください。
#import <NotificationCenter/NotificationCenter.h>
@interface ViewController () <NCWidgetProviding> {...}
[ウィジェットのドキュメントの 41 ページを確認してください https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf ]
私が使用したアプローチは、完全ではなく、通知センターに小さな残骸がありますが、私にとってはうまくいきました:
viewDidLoad() で、優先コンテンツ サイズの高さを 1 に設定します。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view from its nib.
preferredContentSize = CGSizeMake(0, 1)
view.setNeedsLayout()
}
次に、ウィジェットが更新されると、実際の高さを取得して設定します。
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)
}
それはより良い使用です
+ (instancetype)widgetController
それから電話する
- (void)setHasContent:(BOOL)flag forWidgetWithBundleIdentifier:(NSString *)bundleID