今天的小部件无法加载特定的代码行

时间:2019-02-05 20:24:21

标签: ios swift today-extension

我已经在我的应用程序中添加了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标签将显示当前时间。

1 个答案:

答案 0 :(得分:1)

好吧,感谢@Chris似乎没有联系,建议我把它整理好!

这似乎是Interface Builder的问题:以某种方式保留了当我在Xcode中添加Today扩展名时自动创建的UILabel的原始名称。有时,在将IBOutlet连接到标签上带有“ Hello World”的标签后,我将其重命名为稍微相关的名称,但是在将{{ 1}}。

控制台没有引发任何问题,有时似乎可以正常工作,但是当出现问题时

TodayViewController

存在,然后它停止工作,没有任何控制台消息。

我只是在探索@Chris对try PropertyListDecoder().decode([Dose].self, from: dosesData as! Data)的评论后才发现的。我重写后首先获取数据:

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() } } } } 名称为{{1 }}。重新连接IB中的UILabel可以解决所有问题,并且我可以编译原始代码。...

这可能值得一记Radar条目,但现在我不想再浪费一天重新创建(如果可能的话)这个问题!