如果我在 SwiftUI 中提取为子视图,如何唯一地获取 Button
How to uniquely get Button if I extract as a subview in SwiftUI
所以我正在制作一个简单的餐厅账单拆分应用程序,并且我有一个按钮,我想在用户单击它时突出显示它。我还希望其他按钮不突出显示。在 UIKit 中,使用 sender.currentTitle.
可以很简单地做到这一点
这是我的按钮代码
struct TipButton: View, Identifiable {
var id: Int
var tipPercentage: String
@State var didTap: Bool = false
@State var buttonLetter: String
@State var zeroPctButton: Bool = false
@State var tenPctButton: Bool = false
@State var twentyPctButton: Bool = false
var body: some View {
Button {
print("Tip is... \(Float(tipPercentage) ?? 7.7)")
didTap.toggle()
if buttonLetter == "A" {
zeroPctButton = true
tenPctButton = false
twentyPctButton = false
}
else if buttonLetter == "B" {
didTap = true
}
} label: {
Text("\(tipPercentage)%")
.font(.largeTitle)
.bold()
}
.background(didTap ? Color.green : Color.clear)
}
}
到目前为止,我一直在尝试使用它并为百分比数量添加不同的东西,例如 Identifiable 和 @State 变量,但无法弄清楚。
在我的主文件中,我会将视图与这些按钮一起构建,例如
struct ButtonsView: View {
var body: some View {
//blah blah
//some UI arranging code
TipButton(id: 1, tipPercentage: "0", buttonLetter: "A")
TipButton(id: 2, tipPercentage: "10", buttonLetter: "B")
TipButton(id: 3, tipPercentage: "20", buttonLetter: "C")
}
}
如您所见,我已经尝试了 id
和 buttonLetter
简而言之,我想点击按钮A,让它高亮,然后当我点击按钮B时,它高亮并且按钮A不再高亮
为此,您需要将 @State
从子视图移至父视图。然后,您可以通过 Binding
.
与子视图共享它
在这个例子中,我有一个 @State
变量存储突出显示的 id
。按下按钮时,它只会更新值。
struct TipButton: View, Identifiable {
var id: Int
var tipPercentage: String
@Binding var highlightedID : Int
var body: some View {
Button {
highlightedID = id
print("Tip is... \(Float(tipPercentage) ?? 7.7)")
} label: {
Text("\(tipPercentage)%")
.font(.largeTitle)
.bold()
}
.background(id == highlightedID ? Color.green : Color.clear)
}
}
struct ButtonsView: View {
@State private var highlightedID : Int = 3
var body: some View {
TipButton(id: 1, tipPercentage: "0", highlightedID: $highlightedID)
TipButton(id: 2, tipPercentage: "10", highlightedID: $highlightedID)
TipButton(id: 3, tipPercentage: "20", highlightedID: $highlightedID)
}
}
所以我正在制作一个简单的餐厅账单拆分应用程序,并且我有一个按钮,我想在用户单击它时突出显示它。我还希望其他按钮不突出显示。在 UIKit 中,使用 sender.currentTitle.
可以很简单地做到这一点这是我的按钮代码
struct TipButton: View, Identifiable {
var id: Int
var tipPercentage: String
@State var didTap: Bool = false
@State var buttonLetter: String
@State var zeroPctButton: Bool = false
@State var tenPctButton: Bool = false
@State var twentyPctButton: Bool = false
var body: some View {
Button {
print("Tip is... \(Float(tipPercentage) ?? 7.7)")
didTap.toggle()
if buttonLetter == "A" {
zeroPctButton = true
tenPctButton = false
twentyPctButton = false
}
else if buttonLetter == "B" {
didTap = true
}
} label: {
Text("\(tipPercentage)%")
.font(.largeTitle)
.bold()
}
.background(didTap ? Color.green : Color.clear)
}
}
到目前为止,我一直在尝试使用它并为百分比数量添加不同的东西,例如 Identifiable 和 @State 变量,但无法弄清楚。
在我的主文件中,我会将视图与这些按钮一起构建,例如
struct ButtonsView: View {
var body: some View {
//blah blah
//some UI arranging code
TipButton(id: 1, tipPercentage: "0", buttonLetter: "A")
TipButton(id: 2, tipPercentage: "10", buttonLetter: "B")
TipButton(id: 3, tipPercentage: "20", buttonLetter: "C")
}
}
如您所见,我已经尝试了 id
和 buttonLetter
简而言之,我想点击按钮A,让它高亮,然后当我点击按钮B时,它高亮并且按钮A不再高亮
为此,您需要将 @State
从子视图移至父视图。然后,您可以通过 Binding
.
在这个例子中,我有一个 @State
变量存储突出显示的 id
。按下按钮时,它只会更新值。
struct TipButton: View, Identifiable {
var id: Int
var tipPercentage: String
@Binding var highlightedID : Int
var body: some View {
Button {
highlightedID = id
print("Tip is... \(Float(tipPercentage) ?? 7.7)")
} label: {
Text("\(tipPercentage)%")
.font(.largeTitle)
.bold()
}
.background(id == highlightedID ? Color.green : Color.clear)
}
}
struct ButtonsView: View {
@State private var highlightedID : Int = 3
var body: some View {
TipButton(id: 1, tipPercentage: "0", highlightedID: $highlightedID)
TipButton(id: 2, tipPercentage: "10", highlightedID: $highlightedID)
TipButton(id: 3, tipPercentage: "20", highlightedID: $highlightedID)
}
}