6

現在の日付に関連する情報を表示するために、iOS8 の今日のウィジェットを使用しています。問題は、表示する関連メッセージがない場合、ウィジェット/セクションをまったく表示したくないことです。

BAアプリが行うように、それが可能でなければならないことを私は知っています(フライトがある場合にのみウィジェットを表示し、それ以外の時間はまったく表示されません). この動作を実現する方法がわかりません。

これを行う方法を知っている人はいますか?

4

4 に答える 4

15

これを行う方法は、を使用することであることがわかりましたNCWidgetController。これにより、適切と思われる基準に基づいて、今日のウィジェットをいつ表示するかを簡単に指定できます。

viewDidLoad今日のウィジェット ビュー コントローラーのメソッド (またはウィジェットのリロード時に呼び出される任意の場所)に以下を追加するだけで機能します。

BOOL hasDataToDisplay = NO;

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

Apple ドキュメント: https://developer.apple.com/library/ios/documentation/NotificationCenter/Reference/NCWidgetController_Class/index.html#//apple_ref/occ/cl/NCWidgetController

警告:表示するコンテンツがないと設定すると、ウィジェット自体から をリセットすることはNCWidgetControllerできません。つまり、一度設定するとNO、親/包含アプリからトリガーしない限り、元に戻すことはできません。

于 2014-09-27T20:10:23.390 に答える
4

ウィジェットの 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 ]

于 2015-05-17T18:43:11.177 に答える
0

私が使用したアプローチは、完全ではなく、通知センターに小さな残骸がありますが、私にとってはうまくいきました:

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)
}
于 2015-09-12T12:07:59.250 に答える
-1

それはより良い使用です

+ (instancetype)widgetController

それから電話する

- (void)setHasContent:(BOOL)flag forWidgetWithBundleIdentifier:(NSString *)bundleID
于 2014-12-05T15:20:40.247 に答える