Я испытываю странное поведение TextFields при использовании SwiftUI в приложении MacOS (XCode 11.0 стабильный, CoreData), возможно, из-за некоторых заблуждений с моей стороны относительно потока данных SwiftUI.
Реализация
Пожалуйста, рассмотрите эту базовую настройку Master / Detail View:
- Модель:
Account
- Контейнер:
ContentView
- Master:
AccountListView
- Подробно:
AccountEditView
final class Account: NSManagedObject, Identifiable {
@NSManaged var id: UUID
@NSManaged var name: String
}
struct ContentView: View {
var body: some View {
NavigationView {
AccountListView()
.listStyle(SidebarListStyle())
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())
.frame(minWidth: 300, idealWidth: nil, maxWidth: nil, minHeight: 300, idealHeight: nil, maxHeight: nil, alignment: .topLeading)
}
}
struct AccountListView: View {
@FetchRequest(entity: Account.entity(), sortDescriptors: [])
var accounts: FetchedResults<Account>
var body: some View {
VStack {
List(accounts) { account in
NavigationLink (destination: AccountEditView(account: account)) {
Text(account.name)
}
}
}
}
}
struct AccountEditView: View {
@ObservedObject var account: Account
var body: some View {
VStack {
TextField("Account Name", text: $account.name)
Spacer()
}
}
}
Выпуск
Представления заполнены правильно. Выбор учетной записи в виде списка корректно обновляет текстовое поле в подробном представлении.
Однако, как только я редактирую значение текстового поля, все становится странным:
- Когда обновляется подробный видтекстовое поле теряет фокус после первого введенного символа. Имя учетной записи в виде списка обновляется должным образом (отображается один введенный символ)
- При повторном вводе textfied я могу набирать больше символов без потери фокуса (опять же, имя учетной записи в списке отображаетсяupdate)
- Как только я нажимаю enter, значение TextField восстанавливает старое значение, а значение представления списка остается на обновленном значении.
- При переключении между различными записями учетной записи, подробный вид показывает правильные значения. Таким образом, объект модели был должным образом обновлен.
Мои вопросы:
- Почему TextField теряет фокус при вводе одного символа в первый раз
- Почему TextField восстанавливает свое предыдущее значение (а не значение модели) при фиксации изменения
Извините за длинный вопрос ...