当没有什么可显示时,如何隐藏iOS 8 Today Widget?

时间:2014-09-26 19:38:30

标签: objective-c ios-app-extension ios8-extension ios8-today-widget

我使用iOS8的今日小部件显示与当天相关的信息。问题是,如果没有相关消息要显示,我根本不想显示小部件/部分。

我知道它必须是可能的,因为BA应用程序会这样做(它只在有航班时显示小部件,其余时间根本不可见)。我只是想办法实现这种行为。

有谁知道如何做到这一点?

4 个答案:

答案 0 :(得分:13)

我发现这样做的方法是使用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,除非你从父/包含应用程序触发它,否则不会再回来。

答案 1 :(得分:4)

在小部件的ViewController的viewDidLoad方法中添加以下内容:

if(isATablet) { // ***************************
  switch (preferences.getString(ORIENTATION, "0")) {
    case "0":
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      break;
    case "1":
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
      break;
    case "2":
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
      break;
    default:
      Toast.makeText(getApplicationContext(), "Bad orientation", Toast.LENGTH_SHORT).show();
  }
}
else{ // ***************************
  editor = preferences.edit(); // ***************************
  editor.putString(ORIENTATION,"0"); // ***************************
  editor.commit(); // ***************************
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

这将禁止小部件显示。

要再次启用它,您必须使用传递YES到setHasContent参数的相同行从包含应用程序执行此操作。确保将必要的导入添加到ViewController中的包含应用程序,该应用程序将重新启用窗口小部件:

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

[查看小部件文档的第41页 https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf]

答案 2 :(得分: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)
}

答案 3 :(得分:-1)

最好使用

+ (instancetype)widgetController

然后致电

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