Странное поведение SwiftUI TextField (MacOS) - PullRequest
0 голосов
/ 05 октября 2019

Я испытываю странное поведение 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 восстанавливает старое значение, а значение представления списка остается на обновленном значении.
  • При переключении между различными записями учетной записи, подробный вид показывает правильные значения. Таким образом, объект модели был должным образом обновлен.

Мои вопросы:

  1. Почему TextField теряет фокус при вводе одного символа в первый раз
  2. Почему TextField восстанавливает свое предыдущее значение (а не значение модели) при фиксации изменения

Извините за длинный вопрос ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...