首页 > 解决方案 > 我们如何在 SwiftUi 的另一个视图中传递布尔状态

问题描述

我必须将不同的结构合二为一。我在主视图中有一个复选框(selectAll),在另一个视图中有其他复选框。当我单击全选时,它工作正常并且全部被选中,但是如果我取消选中以下任何列表,则 selectAll 复选框仍处于选中状态。selectAll 是一个布尔状态。我想取消选中它。列表切换上的功能是另一个不在 selectAll 类中的类。谢谢任何帮助将不胜感激。

这是复选框列表代码

  Button(action: {
                print("to action")
                                   self.packDto.selected.toggle()
                
                                   if self.packDto.selected {
                                       self.selectedPacks.selectedPackIdList.append(self.packDto.id)
                                       //                        self.selectedPacks.selectedPackIdList.append(1)
                                   } else {
                                       if self.selectedPacks.selectedPackIdList.contains(self.packDto.id) {
                                           self.selectedPacks.selectedPackIdList.remove(at: self.selectedPacks.selectedPackIdList.firstIndex(of: self.packDto.id)!)
                                       } }
                                   
                                   self.selectedPacks.objectWillChange.send()
                                   self.selectedCount += (self.packDto.selected ? 1 : -1)
                                   self.parentObservablePublisher.send()
                                   print(String(self.selectedPacks.selectedPackIdList.count)
                           
            }, label: {
                Image(systemName: (self.packDto.customsDeclarationId == nil || self.customsDeclarationId == self.packDto.customsDeclarationId) && self.selectableStatusId.contains(packDto.statusId) ?
                    (packDto.selected ? "checkmark.rectangle.fill" : "rectangle")
                    : "slash.circle").resizable().scaledToFit()
                    .frame(width: 50, height: 50)
                    .padding(.top, 2)
                    .padding(.bottom, 2)
    })
This is main view code where select all is being called
    func selectAllPackets() {
        self.selectAll.toggle()
        for (index, dto) in self.packListViewModel.packDtoList.enumerated() {
            // TODO selectable pack status id
            if (dto.statusId == PackStatusEnum.WAITING_LOGISTIC.rawValue )  && dto.selected != self.selectAll {
                dto.selected = self.selectAll
                selectedCount += (self.selectAll ? 1 : -1)
                print("In maın",selectedCount)
                self.packListViewModel.packDtoList[index] = dto.copy() as! PackDtoprint(self.selectAll)}}  self.packListViewModel.objectWillChange.send()}

标签: swiftswiftuistate

解决方案


试试这个。

所以 selectAll 切换将启用/禁用所有子切换。

struct ParentView: View {
    @State var selectAll = false
    @State var selectOne = false
    
    var body: some View {
        VStack {
            Toggle("Select all", isOn: $selectAll).onChange(of: selectAll) { value in
                selectOne = selectAll
            }
            
            ChildView(selectAll: $selectAll, selectOne: $selectOne)
        }
    }
}
    
struct ChildView: View {
    @Binding var selectAll: Bool
    @Binding var selectOne: Bool
    
    var body: some View {
        Toggle("Select one", isOn: $selectOne).onChange(of: selectOne) { value in
            if !selectOne {
                selectAll = false
            }
        }
    }
}

推荐阅读