我正在开发一个允许用户使用2个单独的文本字段输入赔率的应用程序。例如,假设用户希望的赔率是3/1。用户将需要在一个字段中输入3,在另一个字段中输入1。
我有2个状态变量:
这是我如何将它们与CustomTextField一起使用:
CustomTextfield(text: $leftOddsVal, placeHolder: "Enter text", keyboardType: .numberPad)
CustomTextfield(text: $rightOddsVal, placeHolder: "Enter text", keyboardType: .numberPad)
CustomTextfield(text: $state, placeHolder: "Enter text", keyboardType: .numberPad)
这是自定义文本字段的代码:
struct CustomTextfield: UIViewRepresentable {
@Binding var text : String
var placeHolder: String
var keyboardType: UIKeyboardType
final class Coordinator: NSObject {
var textField: CustomTextfield
init(_ textField: CustomTextfield) {
self.textField = textField
}
}
func makeCoordinator() -> DabbleTextfield.Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> UITextField {
let textField = UITextField()
textField.backgroundColor = .white
textField.placeholder = self.placeHolder
textField.keyboardType = self.keyboardType
return textField
}
func updateUIView(_ uiView: UITextField, context: Context) {
}
}
我想做什么:
我想获取每个字段的值,并写一些逻辑来弄清楚可能会输掉多少,然后更新屏幕上的一些文本标签。我希望在所有字段都具有值之后,自动更新赢/输标签,而不是让用户先提交表单,然后再查看输赢。
这些是标签的外观:
问题:
textFieldDidEndEditing委托方法需要知道要触发的方法。这意味着,我需要修改CustomTextField来触发viewModel内部将触发的方法。然后,我可以触发赢/输计算方法。但是,我开始感到这是一件很简单的事情,需要做很多工作。看起来很乱。
我无法直接在视图内部访问文本字段值。如果我使用的是SwiftUI的TextField组件,这将很简单。但是,我正在使用包装在UIRepresentable结构中的UIKit的UITextField组件,如上面的代码所示。
我尝试过的:
我有一个视图模型,我试图将其传递给CustomtextField。
我只是这样声明我的环境变量:
struct CustomTextfield: UIViewRepresentable { @EnvironmentObject var viewModel: EnvironmentObject<AnyObject> @Binding var text : String var placeHolder: String var keyboardType: UIKeyboardType
我使用AnyObject,以便可以将传递给CustomTextField的任何模型转换为正确的类型。我根本不需要手动修改CustomTextField来适应可能与我一起使用的每个模型。
我现在这样使用CustomTextField:
CustomTextfield(viewModel: betViewModel as! EnvironmentObject<BetViewModel>, value: $oddsLeftValue, placeHolder: "Enter text", keyboardType: .numberPad)
并且我将TextField的副本存储在ViewModel的变量中:
func makeUIView(context: Context) -> UITextField { let textField = UITextField() if let fieldValue = textField.text { self.viewModel.textField = fieldValue }
但出现以下错误:
Type 'AnyObject' does not conform to protocol 'ObservableObject'
我还尝试将绑定的文本值设置为textField的值,但这也不起作用。
我希望有人可以让我对我做错的事情有所了解。我觉得我正在盘旋,原因是尝试重用UIRepresentable UIKit组件。似乎限制了我,导致解决方法似乎对我要实现的目标来说是过大的选择。
我要做的就是允许用户输入赔率和赌注,并动态更新赢/输标签,而无需点击任何按钮。同时可以重用CustomTextField。
期待您的建议。预先感谢。
我正在开发一个允许用户使用2个单独的文本字段输入赔率的应用程序。例如,假设用户希望的赔率是3/1。用户将需要在一个字段中输入3,然后...
下面使您的自定义文本字段可操作...用于更新外部边界,希望这是这么长的描述的目标。