Неустранимая ошибка: доступ к состояниюснаружи View.body - PullRequest
0 голосов
/ 11 июня 2019

У меня проблема при попытке заставить текстовые поля работать в SwiftUI. Я получаю Fatal error: Accessing State> outside View.body всякий раз, когда пытаюсь запустить следующий код.

У кого-нибудь есть предложение?

struct SearchRoot : View {

    @State var text: String = ""

    var body: some View {
        HStack {
            TextField($text,
                      placeholder: Text("type something here..."))
            Button(action: {
                // Closure will be called once user taps your button
                print(self.$text)
            }) {
                Text("SEND")
            }
        }
    }
}

Я использую бета-версию Xcode версии 11.0 (11M336w) на MacOS 10.15 Beta (19A471t)

Редактировать: упрощенный код, все еще получая ту же ошибку.

struct SearchRoot : View {

    @State var text: String = ""

    var body: some View {
            TextField($text,
                      placeholder: Text("type something here..."))
    }
}

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Компилятор выдает ошибку, если оператор $ используется вне body, в View. Инициализатор кнопки определяется как:

init (действие: @escaping () -> Void, метка @ViewBuilder: () -> метка)

Вы используете $ в закрывающем закрытии, в первом фрагменте кода.

Это означает, что action может пережить ( escape ) body, отсюда и ошибка.

Второй фрагмент компилируется и прекрасно работает для меня.

0 голосов
/ 11 июня 2019

Эврика! SwiftUI хочет единственный источник правды.

То, что я не учел в своих исходных фрагментах кода, это то, что эта структура находится внутри приложения с вкладками.

Чтобы исправить это, мне нужно было определить @State var text: String = "" в структуре, которая создает TabbedView верхнего уровня, а затем использовать $ Binding в SearchRoot.

Я не уверен, работает ли он так, как задумано, или это проблема с бета-1, но сейчас это так.

struct ContentView : View {
    @State private var selection = 0
    @State private var text: String = "searching ex"

    var body: some View {
        TabbedView(selection: $selection){
            ShoppingListRoot().body.tabItemLabel(Text("Cart")).tag(0)
            SearchRoot(text: $text).body.tabItemLabel(Text("Search")).tag(1)
            StoreRoot().body.tabItemLabel(Text("Store")).tag(2)
            BudgetRoot().body
                .tabItemLabel(Text("Budget"))
                .tag(3)
            SettingsRoot().body
                .tabItemLabel(Text("Settings"))
                .tag(4)

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