Передача функций с переменной State в Child View - PullRequest
2 голосов
/ 01 февраля 2020

Я пытаюсь передать различные функции дочернему виду. Для этого я использую typalias и разные инициализаторы.

При попытке передать переменную @State я получаю сообщение об ошибке. Как мне установить переменную Binding в дочернем представлении?

Ошибка выглядит следующим образом:

Невозможно присвоить значение типа 'Bool' для типа 'Binding'

Вот мой код:

typealias OnTabHandler = (String) -> Void

struct ContentView: View {
    @State var showSheet = false

    var onTabHandler:OnTabHandler = { text in
        print(text)
    }

    var body: some View{
        VStack{
            // print to console
            ChildView(text: "Hello", onTabHandler: onTabHandler)

            // show sheet
            ChildView()
                .sheet(isPresented:$showSheet){ Text("sheet view")}
        }
    }
}

struct ChildView:View{
    var text:String
    var onTabHandler:OnTabHandler
    var showSheet:Binding<Bool>

    // print to console
    init(text:String, onTabHandler:@escaping OnTabHandler){
        self.text = text
        self.onTabHandler = onTabHandler
        self.showSheet = Binding.constant(false)
    }

    // show sheet
    init(showSheet:Binding<Bool>){
        self.showSheet = showSheet
        self.onTabHandler = {_ in

            // Error here
            self.showSheet = true
        }
        self.text = ""
    }

    var body: some View{
        Button("Tab Me"){
            self.onTabHandler(self.text)
        }
    }
}

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

См. Ниже для двух конструкторов.

Совет: Использование .constant считается допустимым только во время прототипирования. Я буду искать ссылку на яблоко, но она упоминается здесь в разделе «Прототип с постоянными привязками» https://www.hackingwithswift.com/quick-start/swiftui/swiftui-tips-and-tricks

import SwiftUI

typealias OnTabHandler = (String) -> Void

struct PassingFunc: View {
    @State var showSheet = false

    var onTabHandler: OnTabHandler = { text in
        print(text)
    }

    var body: some View{
        VStack{
            // print to console
            ChildView(text: "Hello - Console", showSheet:$showSheet, onTabHandler: onTabHandler)

            // show sheet
            ChildView(text: "Hello - Present"
                , showSheet:$showSheet, onTabHandler: {_ in
                self.showSheet = true}
            )
                .sheet(isPresented:$showSheet){ Text("sheet view")}
        }
    }
}

struct ChildView:View{
    var text:String
    @Binding var showSheet: Bool
    var onTabHandler:OnTabHandler

    var body: some View{
        Button("Tab Me"){
            self.onTabHandler(self.text)
        }
    }
}
1 голос
/ 01 февраля 2020

Это структура, вы не можете использовать self в таком случае, потому что она фактически будет пытаться скопировать значение, конструкция которого еще не закончена ... вместо этого вы можете использовать привязку напрямую, потому что привязка на самом деле является держателем ссылки, поэтому правильный и отработанный подход в вашем случае -

self.onTabHandler = {_ in

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