ios - Today Widget 无法使用特定的代码行加载
问题描述
我在我的应用程序中添加了 Today 扩展,在编译特定代码行之前一切正常。注意:已编译,未执行!
我TodayViewController
的是:
class StoredDoses {
func getDoses(doses: inout [Dose]) {
if let userD = UserDefaults(suiteName: "com.btv.mySuite") {
if let dosesData = userD.object(forKey: "doses_key") {
do {
// -----------------------------------------------
// Comment the line below out and the widget works
doses = try PropertyListDecoder().decode([Dose].self, from: dosesData as! Data)
// -----------------------------------------------
} catch {
print ("ERROR")
}
}
}
}
}
class TodayViewController: UIViewController, NCWidgetProviding {
@IBOutlet weak var aText: UILabel!
@IBOutlet weak var bText: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view from its nib.
}
func widgetPerformUpdate(completionHandler: (@escaping (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
//Just for development stage - not real, final code
let form = DateFormatter()
form.timeStyle = .short
aText.text = form.string(from: Date())
completionHandler(NCUpdateResult.newData)
}
}
所以,上面的代码写得不好,但它是我用来最终缩小卸载小部件的原因的。数组Doses
是一个自定义的、可编码的类,但是如果我尝试获取一个数组,String
那么它是一样的。该StoredDoses
代码包含在主应用程序中,不会导致任何问题。
只是重申一下:我不想在StoredDoses
类中执行任何方法。我什至在小部件中都没有它的实例。当该doses = ...
行仅被注释掉时,小部件加载并且小aText
部件中的标签显示为当前时间。
解决方案
好的,多亏了@Chris'显然没有联系的建议,我把它整理好了!
这似乎是一个 Interface Builder 问题:不知何故,它保留了UILabel
我在 Xcode 中添加 Today 扩展时自动创建的原始名称。在某些时候,在将 an 连接IBOutlet
到其中带有“Hello World”的标签后,我将它重命名为稍微相关的东西,但在在TodayViewController
.
控制台没有抛出任何问题,有时似乎可以工作,但是当线路与
try PropertyListDecoder().decode([Dose].self, from: dosesData as! Data)
存在然后它停止工作而没有任何控制台消息。
在我探索了@Chris 对as! Data
. 我重写以首先获取数据:
if let userD = UserDefaults(suiteName: "com.btv.mySuite") {
if let dosesData = userD.object(forKey: "doses_key") {
if let unwrappedData = dosesData as? Data {
do {
doses = try PropertyListDecoder().decode([SplitDose].self, from: unwrappedData)
} catch {
doses.removeAll()
}
}
}
}
一旦编译完成(请记住,它仍然没有被执行 - 这只是坐在那里等待使用)控制台抛出一条消息并且应用程序崩溃并显示旧UILabel
名称为not key-compliant
. 重新连接UILabel
IB 修复了所有问题,我可以编译原始代码....
这可能值得 Radar 条目,但现在我不想再浪费一天重新创建(如果可能的话)这个问题!
推荐阅读
- android - 在 API 28(Android Pie) 上支持 Android StrongBox 的 Android 智能手机列表
- bash - 等待命令在 Bash 脚本中未按预期运行
- python-3.x - 从一组字符串中查找整数
- python - 当我有唯一列表时如何停止该功能?
- dart - 当用户点击任何一天时,如何在日历天数下显示值
- jquery - 如何在输入时从远程服务器动态加载并显示给用户
- python - 他们是使用第一列作为索引将单个二维数组拆分为多个不同形状的一维数组的方法吗?
- python - 如何训练具有预测值的 keras 模型?
- javascript - 循环遍历一个对象,并从另一个对象设置其值
- elasticsearch - 如何保护弹性搜索 API