【问题标题】:SwiftUI Views with a custom init带有自定义初始化的 SwiftUI 视图
【发布时间】:2019-11-16 13:09:23
【问题描述】:

假设我正在制作一个如下所示的自定义输入元素:

struct CustomInput : View {
    @Binding var text: String
    var name: String

    var body: some View {
        TextField(name, text: $text)
            .modifier(InputModifier())

    }
}

目前,当我实例化此视图时,我需要将 textname 名称都传递给参数。我希望能够将 name 参数设为可选,如下例所示。

 CustomInput("Some name", $text)

通常我会为此使用 init 方法。但我不确定如何在 init 函数中处理像 @Binding 这样的属性包装器。

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    你可以这样写你的初始化器:

    struct CustomInput : View {
        @Binding var text: String
        var name: String
    
        init(_ name: String, _ text: Binding<String>) {
            self.name = name
    
            // Beta 3
            // self.$text = text
    
            // Beta 4
            self._text = text
        }
    
        var body: some View {
            TextField(name, text: $text)
        }
    }
    

    【讨论】:

    • 在 beta 4 中更改了属性包装器,更新了代码以反映这一点。
    • @matt: $ 访问器现在是不可变的。当使用 beta4 以这种方式初始化它时,编译器会给你:不能分配给属性:'$text' 是不可变的。请注意,美元符号仍然用于传递绑定,下划线仅在初始化时才需要。
    • 是的,我想通了。你没有完全正确地描述他们做了什么,但我真的很高兴你提醒我注意这一变化!非常感谢。以下是更改摘要:forums.swift.org/t/se-0258-property-wrappers-third-review/26399
    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多