我正在使用 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