我们如何在 SwiftUi 的另一个视图中传递布尔状态

Posted

技术标签:

【中文标题】我们如何在 SwiftUi 的另一个视图中传递布尔状态【英文标题】:How can we pass boolean state in an other view in SwiftUi 【发布时间】:2021-02-01 15:01:52 【问题描述】:

我必须将不同的结构合二为一。我在主视图中有一个复选框(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()

【问题讨论】:

您会添加演示问题的代码吗? 欢迎来到 SO。请edit 您的问题包括minimal reproducible example 显示您已经尝试过的内容。另见How to Ask。 【参考方案1】:

试试这个。

所以 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
            
        
    

【讨论】:

谢谢!我使用了这个,但为此,我必须描述新的子视图,因为我使用相同的视图来显示。 如果它帮助您解决了问题,请不要忘记将其标记为答案。

以上是关于我们如何在 SwiftUi 的另一个视图中传递布尔状态的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在没有 SwiftUI 中的 NavigationButton 的情况下导航到 NavigationView 中的另一个视图?

如何创建一个带有输入的闭包结构参数,在 SwiftUI 中返回“some View”而不是“AnyView”?

从 swiftUI 中的另一个视图中关闭模态视图

如何在 SwiftUI 中计算数组的总计、小计和平均值

SwiftUI:如何在另一个视图中更新传递的数组项