从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'self' 是不可变的”
Posted
技术标签:
【中文标题】从子视图中更改视图中的数组“不能在不可变值上使用变异成员:\'self\' 是不可变的”【英文标题】:Mutating an array within a view from a subview "Cannot use mutating member on immutable value: 'self' is immutable"从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'self' 是不可变的” 【发布时间】:2021-01-22 16:31:11 【问题描述】:我试图在结构(swiftui 视图)中调用一个函数,该函数将一个项目附加到一个数组,然后映射到一个列表。该函数在子视图中被调用,但我不断收到错误消息“不能在不可变值上使用变异成员:'self' 是不可变的”。
继承父级中的函数:
mutating func addNote(note: String)
var newNotes = notes;
newNotes.append(note);
notes = newNotes;
体内有:
List
ForEach(notes, id: \.self) string in
Section(header: Text("1/22/20"))
Text(string)
...
要将函数传递给子视图,我试试这个:
NavigationLink(destination: AddNoteView(delegate: addNote))
Text("Add note")
我的 addNoteView() 看起来像这样:
struct AddNoteView : View
@State var note: String = ""
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var delegate: (String) -> ()
var body: some View
NavigationView
Form
Section(header: Text("Note"))
TextField("Note", text:$note)
Section()
Button(action:
delegate(note)
presentationMode.wrappedValue.dismiss())
Text("Add note")
有人知道我做错了什么吗?非常感谢!
【问题讨论】:
您不能使用结构附加项目。使用@State var newNotes......创建数组或使用类进行操作。 【参考方案1】:SwiftUI 视图是一个结构,你不能从自身内部改变它。将notes
设为@State
即可使用
@State var notes: [String] = []
// .. other code
func addNote(note: String)
notes.append(note)
【讨论】:
以上是关于从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'self' 是不可变的”的主要内容,如果未能解决你的问题,请参考以下文章
如何从子视图更改 UIImageView 的 UIImage?