【问题标题】:Swift - Cannot append Object to ArraySwift - 无法将对象附加到数组
【发布时间】:2021-01-02 17:20:53
【问题描述】:

我在我的应用程序中创建了一个新视图,但可识别对象不会附加到数组中。 我真的不知道为什么它没有附加......

代码如下:

struct FirstSettingsIdentifiables: Identifiable {
    var id: UUID = UUID()
    
    var name: String
    var icon: String
}
struct SettingsView: View {
    
    @EnvironmentObject var settingItems: ContentModel
    
    @State var firstArr: [FirstSettingsIdentifiables] = []
    
    init() {
        createFirstList()
        print("Settings successfully initialized.")
    }
    
    var body: some View {
        
        return VStack {
            Text("Einstellungen")
                .font(.title)
            
            NavigationView {
                //Mitteilungen Liste
                List(firstArr) { x in
//                    ForEach(firstArr) { x in
    //                    VStack {
    //                        Image(systemName: x.icon)
                            Text("Das ist ein test")
    //                    }
//                    }
                }.navigationBarTitle("Mitteilungen")
            }
        }
    }
    
    func createFirstList() {
        
        let aText = "Mitteilungen"
        let aIcon = "info.circle.fill"
        let aObject = FirstSettingsIdentifiables(name: aText, icon: aIcon)
        
        firstArr.append(aObject)
        
        print(firstArr.count)
        
    }
    
    
}

问题可能出在createFirstList() 部分。在这个函数中,对象aObject 充满了数据(这工作正常),但是对象不会附加到我的firstArr。计数始终为0

我在这里做错了什么?

【问题讨论】:

    标签: arrays swift swiftui


    【解决方案1】:

    您更改firstArr 的值太早了。不要在 init 中调用 createFirstList(),而是将其删除,并将以下代码添加到视图主体中:

    VStack {
        /* ... */
    }
    .onAppear(perform: createFirstList)
    

    或者,您可以执行以下操作:

    init() {
        _firstArr = State(initialValue: getFirstList())
        print(firstArr.count)
        print("Settings successfully initialized.")
    }
    
    /* ... */
    
    func getFirstList() -> [FirstSettingsIdentifiables] {
        let aText = "Mitteilungen"
        let aIcon = "info.circle.fill"
        let aObject = FirstSettingsIdentifiables(name: aText, icon: aIcon)
        return [aObject]
    }
    

    【讨论】:

    • 它可以工作,但是如果我点击另一个视图然后返回到这个视图,它会再次执行“createFirstList”函数。并且无法使用第二种方法,因为我将来要附加 1 个以上的对象。
    • 我添加了一个 Bool 变量,该变量在 createFirstList 执行后设置为 false,然后不再执行。但我不认为这是解决它的最好方法!还有其他方法吗?
    • @yama_HD 我不确定你的意思。拥有布尔变量的原因是什么?
    • 检查 onAppear 是否已经执行。因为每次我打开视图时它都会执行,然后我有两次所有变量
    • @yama_HD 在这种情况下,不要使用firstArr.append(aObject),而是使用firstArr = [aObject]。这应该可以解决您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多