我们如何在 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 中的另一个视图?