У меня есть класс, «циферблат» с регулярными обновлениями; он должен отображать массив метрик, которые меняются со временем.
Поскольку я хотел бы, чтобы часы также отображались в виджете, я обнаружил, что должен был поместить класс в каркас (возможно, есть другой путь, но я слишком далеко по дороге сейчас). Похоже, это вызвало проблему с SwiftUI и наблюдаемыми объектами.
В моем View
у меня есть:
@ObservedObject var clockFace: myClock
На циферблате у меня есть:
class myClock: ObservableObject, Identifiable {
var id: Int
@Publish public var metric:[metricObject] = []
....
// at some point the array is mutated and the display updates
}
Я не знаю, нужен ли Identifiable
, но это не имеет никакого значения для результата. public
требуется компилятором, но в любом случае он всегда был таким.
С этими строками я получаю ошибку времени выполнения при запуске приложения:
objc [31175] нет класса для метакласса
Поэтому я снял @Published
и переключился на ручное обновление:
public var metric:[metricObject] = [] {
didSet {
self.objectWillChange.send()`
}
}
А теперь я получаю отображение и, установив точку останова, могу см. send()
вызывается через равные промежутки времени. Но дисплей не будет обновляться, пока я не добавлю / не удалю из массива. Я предполагаю, что вычисленные переменные (которые составляют большую часть изменения metricObject
не видны SwiftUI. Впоследствии я попытался добавить «фиктивный» Int
в класс myClock
и установить его в случайное значение для попытки ручного обновления sh через send()
на didSet
без везения.
Так как я могу заставить периодическую c перерисовку дисплея?