Сегодня виджет не может быть загружен с определенной строкой кода - PullRequest
0 голосов
/ 05 февраля 2019

Я добавил расширение Today в свое приложение, и все работает нормально, пока не скомпилирована конкретная строка кода.NB: скомпилировано, не выполнено!

Мой 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 голосов
/ 06 февраля 2019

Хорошо, поэтому благодаря явно неподключенному @Chris совету я его отсортировал!

Похоже, что это проблема Интерфейсного Разработчика: каким-то образом он сохранил первоначальное имя UILabel, которое было автоматическим-создано, когда я добавил расширение Today в Xcode.В какой-то момент, после подключения 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, но сейчас я не хочу тратить еще один день на воссоздание (если ввсе возможно) это проблема!

...