如何在 SwiftUI 列表行中独立选择复选框按钮和 NavigationLink 到另一个视图

Posted

技术标签:

【中文标题】如何在 SwiftUI 列表行中独立选择复选框按钮和 NavigationLink 到另一个视图【英文标题】:How to select checkbox button and NavigationLink to another view independently in SwiftUI List row 【发布时间】:2019-08-19 14:33:33 【问题描述】:

我希望做一个列表就像待办事项列表一样,单元格有一个复选框和文本。我希望在选择列表单元格时,可以将视图转换为 detailView。同时我也可以选中复选框,但不要触发视图转换为详细视图。

我删除了 List,代码运行正常,但是 List 属性和方法不能再使用了。所以我打算编写一个客户列表视图。但我不认为这将是一个好方法。所以如果还是找不到好的方法,最后还是可以这样实现。

NavigationView 
     VStack    
        List 
                 ForEach(todayDietModel.todayDietItems)  item in
                     NavigationLink(destination: DietItemDetailView()) 
                            TodayDietRow(todayDietItem: item)
                                .animation(.spring())
                        
                    
                

            
            .frame(width: 352, height: 400)
            .background(Color.white)
            .cornerRadius(16)




struct TodayDietRow: View 
   @State var isFinished: Bool = false

    var body: some View 
        HStack(spacing: 20.0) 
            Button(action: self.isFinished.toggle()) 
                if self.isFinished 
                    Image("icon_checked_s001")
                        .resizable()
                        .renderingMode(.original)
                        .aspectRatio(contentMode: .fit)
                        .frame(width: 24, height: 24)
                 else 
                    Image("icon_unchecked_s001")
                        .resizable()
                        .frame(width: 24, height: 24)
                

            
            .padding(.leading, 10)


            Text("DietName")
                .font(.system(size:13))
                .fontWeight(.medium)
                .foregroundColor(Color.black)   

        
        .frame(width: 327, height: 48)


    



【问题讨论】:

【参考方案1】:

这与复选框图像上的手势配合得很好。两个按钮不起作用,因为每次点击都会同时访问两个按钮。

struct TodayTodoView2: View 
    @ObservedObject var todayDietModel = TodayDietModel()

    func image(for state: Bool) -> Image 
        return state ? Image(systemName: "checkmark.circle") : Image(systemName: "circle")
    

    var body: some View 
        NavigationView 
            VStack 
                List 
                    ForEach($todayDietModel.todayDietItems)  (item: Binding<TodayDietItem>) in
                        HStack
                            self.image(for: item.value.isFinished).onTapGesture 
                                item.value.isFinished.toggle()
                            
                            NavigationLink(destination: DietItemDetailView2(item: item)) 
                                Text("DietNamee \(item.value.dietName)")
                                    .font(.system(size:13))
                                    .fontWeight(.medium)
                                    .foregroundColor(Color.black)
                            
                        
                    
                
                .background(Color.white)
            
        
    

【讨论】:

以上是关于如何在 SwiftUI 列表行中独立选择复选框按钮和 NavigationLink 到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 列表行中的多个按钮

SwiftUI,列表行添加按钮

如何在 SwiftUI 列表行中具有相同的比例?

如何创建一个道场数据网格,其中一列是标题行中的按钮?

如何禁用 SwiftUI 的默认行为?

如何取消选择 NavigationLink 中的列表按钮