我们有一个今日小部件,根据相应应用中的数据设置,最多显示6个按钮。此数据使用app-groups共享。如果至少配置了一个按钮,它将显示如上图所示。如果用户未登录,或者未配置任何按钮,则会显示如下图所示的消息。
在几个小时(大约4到7之间)未打开应用程序后,小部件将恢复为“未配置按钮”视图。
使用如下所示的代码完成从app-group加载数据的方式。 (gist for full code)在我编写它的方式中,可以显示“无按钮配置”视图的唯一方法是buttons
数组实际存在但长度为零。
我期望缓存清除或后台服务停止,但据我所知,应该提前发现异常:
userDefaults
应为零,因此应显示“未登录视图”。buttons
应为零,因此应再次显示“未登录视图”考虑到应用程序在后台没有任何操作,应用程序本身无法更改按钮。
我尝试连接调试器时再现这个,但问题不会重现。
是否有人对如何解决此问题或如何开始调试这一问题有任何想法?
相关文件:
相关代码:
private struct sharedData {
static var baseUrl: String?
static var token: String?
static var phoneDeviceId: String?
static var buttons: Array<Button>?
}
func loadData() {
let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier!
var groupIdArray = groupIdentifier.componentsSeparatedByString(".")
groupIdArray.removeAtIndex(groupIdArray.count - 1)
let appGroupIdentifier = groupIdArray.joinWithSeparator(".");
let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier)
if (userDefaults == nil) {
print("Error in user defaults")
setButtonTitle("Not logged in. Open Triggi to continue.")
return false
}
sharedData.baseUrl = userDefaults?.valueForKey("baseUrl") as? String
sharedData.token = userDefaults?.valueForKey("token") as? String
sharedData.phoneDeviceId = userDefaults?.valueForKey("phoneDeviceId") as? String
let buttons = userDefaults?.valueForKey("buttons") as? NSArray
if (sharedData.baseUrl == nil || sharedData.token == nil || sharedData.phoneDeviceId == nil || buttons == nil) {
print("Missing data")
setButtonTitle("Not logged in. Open Triggi to continue.")
return false
}
if (buttons?.count == 0) {
print("No buttons configured")
setButtonTitle("No buttons configured. Open Triggi to continue.")
return false;
}
// More things are done with the data here
}
答案 0 :(得分:1)
Today Extension Controller
是UIViewController
,因此遵循与UIViewController
相同的生命周期。因此,每当加载viewDidLoad()
时,都会调用生命周期方法widget
。
此外,widgetPerformUpdateWithCompletionHandler
被称为:
所以,不要只在loadData()
中调用widgetPerformUpdateWithCompletionHandler
,而是从viewDidLoad()
调用它。
此外,您在哪里编写代码以从superview添加/删除UIButtons
并显示&#34;没有配置按钮&#34;你的代码?