我观看了一些有关数据绑定的WWDC视频和Apple文档,根据我目前的理解,@ State作为属性委托,将在视图和带注释的属性之间提供绑定连接,例如:
@State var myText: String
var body: some View {
VStack {
TextField($myText, placeholder: Text("input"))
Text(myText)
}
}
Run Code Online (Sandbox Code Playgroud)
这会将myTest与我添加的文本字段的内容绑定在一起(即,一项更改将跟进另一项更新)
但是,尽管我知道$ myText指的是Binding的绑定类型,但我注意到Binding也是属性委托,并且我注意到它出现在Apple的一些代码示例中。我不知道这是什么用作属性委托。@State已经可以进行绑定了,那么我们需要@Binding做什么呢?苹果文档对此很烂。
在Ray遵循的教程中,我设置了以下属性
struct ContentView : View {
var rTarget = Double.random(in: 0..<1)
var gTarget = Double.random(in: 0..<1)
var bTarget = Double.random(in: 0..<1)
}
Run Code Online (Sandbox Code Playgroud)
这些当然是不可变的,因此除非我将该功能标记为变异的,否则我无法通过功能对其进行修改
func reset() {
rTarget = Double.random(in: 0..<1)
gTarget = Double.random(in: 0..<1)
bTarget = Double.random(in: 0..<1)
}
Run Code Online (Sandbox Code Playgroud)
Cannot assign to property: 'self' is immutable
但我称此功能为 var body
mutating func reset() {
rTarget = Double.random(in: 0..<1)
gTarget = Double.random(in: 0..<1)
bTarget = Double.random(in: 0..<1)
}
fileprivate mutating func displayAlert() -> Alert {
return Alert(title: Text("Your Score"), message: Text("\(computeScore())"), dismissButton: …Run Code Online (Sandbox Code Playgroud) @propertyWrapper和之间有@propertyDelegate什么区别?他们在所有WWDC19视频中都谈到@propertyWrapper,但是所有实际的实现方式都使用@propertyDelegate(即SwiftUI-State);编译器Xcode 11 Beta似乎接受两者并要求完全相同的要求:
@propertyDelegate struct A {
}
// Property delegate type 'A' does not contain a non-static property named 'value'
Run Code Online (Sandbox Code Playgroud)
@propertyWrapper struct A {
}
// Property delegate type 'A' does not contain a non-static property named 'value'
Run Code Online (Sandbox Code Playgroud)
请注意,在两种情况下,编译器均会显示“属性委托”。
我是否想念某些东西,或者是因为他们尚未决定使用哪个名称?
另一个SwiftUI斗争!
我有一个包含列表的视图。当用户点击一行时,我想先将所选项目保存在我的VM中,然后再推送另一个视图。我能想到的解决该问题的唯一方法是,首先保存选定的行,然后使用另一个按钮来推送下一个视图。似乎仅需轻按一下即可完成此操作。
有人知道吗?
这是代码:
struct AnotherView : View {
@State var viewModel = AnotherViewModel()
var body: some View {
NavigationView {
VStack {
List(viewModel.items.identified(by: \.id)) { item in
NavigationLink(destination: DestinationView()) {
Text(item)
}
// Before the new view is open, I want to save the selected item in my VM, which will write to a global store.
self.viewModel.selectedItem = item
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!