大佬教程收集整理的这篇文章主要介绍了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,请注明来意。