选择器 (SegmentedPickerStyle) 中的选择效果不佳 - SwiftUI
Selection in Picker (SegmentedPickerStyle) isn't working well - SwiftUI
我有 SegmentedPickerStyle()
风格的选择器。现在我正在根据选择器值进行一些计算,并且它正在运行。但是不知何故,如果我点击它,我的选择器并没有改变它的 selection 值。要更改 selection 值,我需要滑动这些值。
另一个问题是,如果我需要计算 TipAmount
那么首先我需要滑动到选择器值,然后需要 select 该值。我不知道为什么会这样!!
这是我的查看代码,
struct ContentView: View {
@ObservedObject var tipViewModel = TipViewModel()
var body: some View {
VStack {
TextField("Enter bill amount", text: $tipViewModel.billAmount)
.textFieldStyle(RoundedBorderTextFieldStyle())
Picker(selection: $tipViewModel.tipPercentage, label: Text("Select tip %")) {
ForEach(tipViewModel.tipChoices, id: \.self) { choice in
//Text("\(self.tipViewModel.tipChoices[choice])")
Text("\(choice)")
}
}.pickerStyle(SegmentedPickerStyle())
.onTapGesture {
self.tipViewModel.calculateTip()
}
Text("Tip Percentage \(tipViewModel.tipPercentage)")
Text(tipViewModel.tipAmount == nil ? "Tip Amount" : "\(tipViewModel.tipAmount!)")
}.padding()
}
}
这里是 TipViewModel 文件,
class TipViewModel: ObservableObject {
@Published var billAmount: String = "" {
didSet{
calculateTip()
}
}
@Published var tipPercentage: Int = 10
@Published var tipAmount: Double = 0
let tipChoices = [10, 15, 20]
let didChange = PassthroughSubject<TipViewModel, Never>()
func calculateTip() {
guard let billAmount = Double(billAmount) else { return }
self.tipAmount = billAmount * Double(tipPercentage) / 100
self.didChange.send(self)
}
}
如有任何帮助,我们将不胜感激!
您有一个 onTapGesture
修改器,它正在吃掉选择器上的点击手势并尝试计算小费。
.onTapGesture {
self.tipViewModel.calculateTip()
}
您可以将小费金额计算为 属性:
struct ContentView: View {
@ObservedObject var tipViewModel = TipViewModel()
var body: some View {
VStack {
TextField("Enter bill amount", text: $tipViewModel.billAmount)
.textFieldStyle(RoundedBorderTextFieldStyle())
Picker(selection: $tipViewModel.tipPercentage, label: Text("Select tip %")) {
ForEach(tipViewModel.tipChoices, id: \.self) { choice in
//Text("\(self.tipViewModel.tipChoices[choice])")
Text("\(choice)")
}
}.pickerStyle(SegmentedPickerStyle())
Text("Tip Percentage \(tipViewModel.tipPercentage)")
Text("\(tipViewModel.tipAmount)")
}.padding()
}
}
class TipViewModel: ObservableObject {
@Published var billAmount: String = ""
@Published var tipPercentage: Int = 10
var tipAmount: Double {
guard let billAmount = Double(billAmount) else { return 0 }
let tipAmount = billAmount * Double(tipPercentage) / 100
return tipAmount
}
let tipChoices = [10, 15, 20]
}
由于您已经将 billAmount
和 tipPercentage
作为 @Published
属性,因此您无需担心向 PassthroughSubject 发送消息以告诉视图在计算时更新属性 变化。当小费金额或总金额发生变化时,将发送 willChange 消息。这将导致视图刷新,这将调用计算的 tipAmount 属性,这将 运行 它的关闭和 return 视图的新值。
我有 SegmentedPickerStyle()
风格的选择器。现在我正在根据选择器值进行一些计算,并且它正在运行。但是不知何故,如果我点击它,我的选择器并没有改变它的 selection 值。要更改 selection 值,我需要滑动这些值。
另一个问题是,如果我需要计算 TipAmount
那么首先我需要滑动到选择器值,然后需要 select 该值。我不知道为什么会这样!!
这是我的查看代码,
struct ContentView: View {
@ObservedObject var tipViewModel = TipViewModel()
var body: some View {
VStack {
TextField("Enter bill amount", text: $tipViewModel.billAmount)
.textFieldStyle(RoundedBorderTextFieldStyle())
Picker(selection: $tipViewModel.tipPercentage, label: Text("Select tip %")) {
ForEach(tipViewModel.tipChoices, id: \.self) { choice in
//Text("\(self.tipViewModel.tipChoices[choice])")
Text("\(choice)")
}
}.pickerStyle(SegmentedPickerStyle())
.onTapGesture {
self.tipViewModel.calculateTip()
}
Text("Tip Percentage \(tipViewModel.tipPercentage)")
Text(tipViewModel.tipAmount == nil ? "Tip Amount" : "\(tipViewModel.tipAmount!)")
}.padding()
}
}
这里是 TipViewModel 文件,
class TipViewModel: ObservableObject {
@Published var billAmount: String = "" {
didSet{
calculateTip()
}
}
@Published var tipPercentage: Int = 10
@Published var tipAmount: Double = 0
let tipChoices = [10, 15, 20]
let didChange = PassthroughSubject<TipViewModel, Never>()
func calculateTip() {
guard let billAmount = Double(billAmount) else { return }
self.tipAmount = billAmount * Double(tipPercentage) / 100
self.didChange.send(self)
}
}
如有任何帮助,我们将不胜感激!
您有一个 onTapGesture
修改器,它正在吃掉选择器上的点击手势并尝试计算小费。
.onTapGesture {
self.tipViewModel.calculateTip()
}
您可以将小费金额计算为 属性:
struct ContentView: View {
@ObservedObject var tipViewModel = TipViewModel()
var body: some View {
VStack {
TextField("Enter bill amount", text: $tipViewModel.billAmount)
.textFieldStyle(RoundedBorderTextFieldStyle())
Picker(selection: $tipViewModel.tipPercentage, label: Text("Select tip %")) {
ForEach(tipViewModel.tipChoices, id: \.self) { choice in
//Text("\(self.tipViewModel.tipChoices[choice])")
Text("\(choice)")
}
}.pickerStyle(SegmentedPickerStyle())
Text("Tip Percentage \(tipViewModel.tipPercentage)")
Text("\(tipViewModel.tipAmount)")
}.padding()
}
}
class TipViewModel: ObservableObject {
@Published var billAmount: String = ""
@Published var tipPercentage: Int = 10
var tipAmount: Double {
guard let billAmount = Double(billAmount) else { return 0 }
let tipAmount = billAmount * Double(tipPercentage) / 100
return tipAmount
}
let tipChoices = [10, 15, 20]
}
由于您已经将 billAmount
和 tipPercentage
作为 @Published
属性,因此您无需担心向 PassthroughSubject 发送消息以告诉视图在计算时更新属性 变化。当小费金额或总金额发生变化时,将发送 willChange 消息。这将导致视图刷新,这将调用计算的 tipAmount 属性,这将 运行 它的关闭和 return 视图的新值。