У меня есть Picker
в SwiftUI Form
, и я пытаюсь обработать значение всякий раз, когда изменяется сборщик. Я ожидал, что смогу сделать это с didSet
для переменной, которая представляет текущее выбранное значение.
import SwiftUI
struct ContentView: View {
enum TransmissionType: Int {
case automatic
case manual
}
@State private var selectedTransmissionType: Int = TransmissionType.automatic.rawValue {
didSet {
print("selection changed to \(selectedTransmissionType)")
}
}
private let transmissionTypes: [String] = ["Automatic", "Manual"]
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $selectedTransmissionType,
label: Text("Transmission Type")) {
ForEach(0 ..< transmissionTypes.count) {
Text(self.transmissionTypes[$0])
}
}
}
}
}
}
}
Пользовательский интерфейс Picker
работает (в основном), как и ожидалось: я вижу значение по умолчанию:выбрав, нажмите в палитре, он открывает новый вид, я могу выбрать другое значение, а затем он возвращается к основной форме и показывает, что выбрано новое значение. Однако didSet
никогда не вызывается.
Я видел этот вопрос , но мне кажется странным добавлять больше в мой код View
вместо простой обработки нового значения, когдапеременные изменения, если это вообще возможно. Лучше использовать onReceive
, хотя это приводит к более сложному представлению? Мой главный вопрос: Что не так с моим кодом для предотвращения вызова didSet
?
Я использовал этот пример , чтобы добраться до этой точки.
Помимо моего обычного вопроса, у меня есть несколько других об этом примере:
A) Кажется странным, как у меня есть enum
и также Array
для представленияте же два значения. Может ли кто-то также предложить лучший способ структурировать его, чтобы избежать этой избыточности? Я считал TransmissionType
объект, но это выглядело как излишнее по сравнению с enum
... может быть, это не так?
B) При нажатии на сборщик экран спараметры выбора скользят, а затем два параметра немного подпрыгивают. Это вызывает резкий скачок и плохой пользовательский опыт. Я делаю что-то не так, что вызывает плохой UX? Или это, вероятно, ошибка SwiftUI? Я получаю эту ошибку каждый раз, когда меняю сборщик:
[TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window.