从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'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?

SwiftUI:从子视图中关闭模式

如何知道何时从子视图中单击了超级视图中的选项卡项

从子视图中的路径对象在 UIView 中构建剪辑区域

从子视图中删除视图不会调用 willRemoveSubview

如何将数据从子视图传递到父视图到 SwiftUI 中的另一个子视图?