程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮?

开发过程中遇到SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮的问题如何解决?下面主要结合日常开发的经验,给出你关于SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮的解决方法建议,希望对你解决SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮有所启发或帮助;

我正在尝试使用按钮数组制作自定义段控件。

当点击按钮时,正确的值会传递到主视图,并且可以多次按下而不会出现问题。问题是上一个被选中的按钮保持选中状态。下面的代码应该可以重新创建问题。感谢您的帮助。

SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮

细分视图

struct WaveTypeGrIDVIEw: VIEw {

var waveTypes = ["Beach Break","Reef Break","Point Break","Rivermouth"]

@Binding var waveTypeSELEcted: String

@State var typeSELEcted: String

let columnSpacing: CGfloat = 5
let rowSpacing: CGfloat = 10
var grIDLayout: [GrIDItem] {
    return Array(repeaTing: GrIDItem(.flexible(),spacing: rowSpacing),count: 1)
}

var body: some VIEw {
    vstack {
        
        Text("Wave Type \(typeSELEcted)")
        
        ScrollVIEw(.horizontal,showsInDicators: false,content: {
            LazyHGrID(rows: grIDLayout,alignment: .center,spacing: columnSpacing,pinnedVIEws: [],content: {
                
                ForEach(waveTypes,ID: \.self) { type in
                    if type == typeSELEcted {
                        TypeItemVIEw(SELEcted: true,typeSELEcted: self.$typeSELEcted,name: typE)
                    } else {
                        TypeItemVIEw(SELEcted: false,name: typE)
                    }
                }
            })//: GRID
            .frame(height: 18)
            .padding(.vertical,8)
            .padding(.horizontal,10)
            
        })//: SCRolL
        .BACkground(color(.systemGray5).cornerRadius(8))
    }
  }
}

struct WaveTypeGrIDVIEw_PrevIEws: PrevIEwProvIDer {
static var prevIEws: some VIEw {
    WaveTypeGrIDVIEw(waveTypeSELEcted: .constant(surfDataTests[0].waveTypE),typeSELEcted: "Beach Break")
        .prevIEwLayout(.sizeThatFits)

  }
}

按钮视图

struct TypeItemVIEw: VIEw {

@State var SELEcted: Bool

@Binding var typeSELEcted: String

let name: String

func test() {
    
}

var body: some VIEw {
    button(action: {
        SELEcted.toggle()
        typeSELEcted = name
    },label: {
        HStack(alignment: .center,spacing: 6,content: {
            Text(Name)
                .Font(.footnotE)
                .FontWeight(.medium)
                .foregroundcolor(SELEcted ? color.white : color.black)
            
        })//: HSTACK
        .frame(height: 18)
        .padding(6)
        .BACkground(SELEcted ? color.blue
                        .cornerRadius(8)
                        : color.white
                        .cornerRadius(8))
        .BACkground (
            RoundedRectangle(cornerRadius: 8)
        )
    })//: button
 }
}

struct TypeItemVIEw_PrevIEws: PrevIEwProvIDer {
static var prevIEws: some VIEw {
    TypeItemVIEw(SELEcted: false,typeSELEcted: .constant("Rivermouth"),name:"Rivermouth")
        .prevIEwLayout(.sizeThatFits)
        .padding()
        .BACkground(color.gray)
 }
}

解决方法

您似乎使您的状态跟踪变得比实际需要的更复杂。您只需要知道当前选择的波形类型。您不需要跟踪单独的 SELEcted 状态,因为按钮可以根据它自己的值和当前选择的值来确定这一点。

对于网格视图,您可以为选定的波浪类型只拥有一个 @State 属性(如果需要,您可以将其作为 @Binding 注入)。

将选定的中断类型和视图的目标值传递给 TypeItemView

struct WaveTypeGridView: View {
    
    var waveTypes = ["Beach Break","Reef Break","Point Break","Rivermouth"]
    
    @State var typeSELEcted: String = "Beach Break"
    
    let columnSpacing: CGFloat = 5
    let rowSpacing: CGFloat = 10
    var gridLayout: [GridItem] {
        return Array(repeaTing: GridItem(.flexible(),spacing: rowSpacing),count: 1)
    }
    
    var body: some View {
        VStack {
            
            Text("Wave Type \(typeSELEcted)")
            
            ScrollView(.horizontal,showsInDicators: false,content: {
                LazyHGrid(rows: gridLayout,alignment: .center,spacing: columnSpacing,pinnedViews: [],content: {
                    
                    ForEach(waveTypes,id: \.self) { type in
                            TypeItemView(typeSELEcted: self.$typeSELEcted,name: typE)
                    }
                })//: GRID
                .frame(height: 18)
                .padding(.vertical,8)
                .padding(.horizontal,10)
                
            })//: SCROLL
            .BACkground(Color(.systemGray5).cornerRadius(8))
        }
    }
}

然后在您的 TypeItemView 中,您可以根据当前值和此视图的目标值为 SELEcted 创建一个计算属性。

struct TypeItemView: View {
    
    @Binding var typeSELEcted: String
    
    let name: String
    
    private var SELEcted: Bool {
        return typeSELEcted == name
    }
    
    func test() {
        
    }
    
    var body: some View {
        Button(action: {
            typeSELEcted = name
        },label: {
            HStack(alignment: .center,spacing: 6,content: {
                Text(Name)
                    .font(.footnotE)
                    .fontWeight(.medium)
                    .foregroundColor(self.SELEcted ? Color.white : Color.black)
                
            })//: HSTACK
            .frame(height: 18)
            .padding(6)
            .BACkground(self.SELEcted ? Color.blue
                            .cornerRadius(8)
                            : Color.white
                            .cornerRadius(8))
            .BACkground (
                RoundedRectangle(cornerRadius: 8)
            )
        })//: BUTTON
    }
}

现在整个控件只依赖于一个 @State 项。

大佬总结

以上是大佬教程为你收集整理的SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮全部内容,希望文章能够帮你解决SwiftUI - 使用按钮的分段控制没有正确取消选择其他按钮所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-