ios 在Swiftui中关闭其他切换

lhcgjxsq  于 2022-11-26  发布在  iOS
关注(0)|答案(1)|浏览(165)

我是swift和swiftUI的新手,所以可能做错了什么,但我显示了一个切换列表。当其中一个打开时,我希望其他的都关闭,这样一次只能选择一个项目。我有一个切换数组,它工作得很好。但是我无法在不产生编译错误的情况下得到'turn off all the other toggles to work'。
errors
这是所有的代码。

import SwiftUI

struct SheetView: View {
    
    @FetchRequest(sortDescriptors:[SortDescriptor(\Book.timestamp)]) private var items: FetchedResults<Book>
    
    @State var doesClose:[Bool] = []
    
    init(numberOfBooks: Int) {
        
        var values: [Bool] = []
        for i in 0..<numberOfBooks {
            values.append(false)
        }
        
        _doesClose = State(initialValue: values)
        
        print(numberOfBooks)
        print(self.doesClose)
    }
    
    
    var body: some View {
        
        NavigationStack{
            
            List {
                ForEach(Array(items.enumerated()), id: \.element) { idx, item in
                              
                    HStack (spacing: 20){
                                             
                        VStack (alignment: .leading, spacing: 5) {
                            Text(item.bookName!)
                                                        
                            Toggle("", isOn: $doesClose[idx])
                                .onChange(of: doesClose[idx], perform: {for i in 0..<doesClose.count {
                                    if(i != idx)
                                    {
                                        doesClose[i] = false
                                    }
                                }})
                            
                            
                        }
                    }
                }
            }
            .navigationTitle("List")
        }
    }
    
    private func turnAllOtherButtonsOff(onIndex:Int)
    {
        
        for i in 0..<doesClose.count {
            if(i != onIndex)
            {
                doesClose[i] = false
            }
        }
    }
}

我也试着在执行阶段运行函数,出现了类似的错误。感谢任何帮助。

pkmbmrz7

pkmbmrz71#

如果这对大家有帮助的话,我把遍历数组的想法抛在一边,只专注于跟踪上一个索引,然后在有onChange时切换它。下面是代码。

Toggle("", isOn: $doesClose[idx])
                                .onChange(of: doesClose[idx], perform: {value in
                                    print(value)
                                    if(value == true)
                                    {
                                        if(oldToggle != -1){
                                            doesClose[oldToggle] = false
                                        }
                                        
                                        oldToggle = idx
                                    }
                                    
                                    print(oldToggle)
                                })

相关问题