当所有文本字段在SwiftUI中都具有值时,如何在屏幕上动态更新标签?

问题描述 投票:1回答:1

我正在开发一个允许用户使用2个单独的文本字段输入赔率的应用程序。例如,假设用户希望的赔率是3/1。用户将需要在一个字段中输入3,在另一个字段中输入1。

enter image description here

我有2个状态变量:

  • leftOddsVal
  • rightOddsVal

这是我如何将它们与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) {

    }

}

我想做什么:

我想获取每个字段的值,并写一些逻辑来弄清楚可能会输掉多少,然后更新屏幕上的一些文本标签。我希望在所有字段都具有值之后,自动更新赢/输标签,而不是让用户先提交表单,然后再查看输赢。

这些是标签的外观:

enter image description here

问题:

  1. textFieldDidEndEditing委托方法需要知道要触发的方法。这意味着,我需要修改CustomTextField来触发viewModel内部将触发的方法。然后,我可以触发赢/输计算方法。但是,我开始感到这是一件很简单的事情,需要做很多工作。看起来很乱。

  2. 我无法直接在视图内部访问文本字段值。如果我使用的是SwiftUI的TextField组件,这将很简单。但是,我正在使用包装在UIRepresentable结构中的UIKit的UITextField组件,如上面的代码所示。

  3. 我尝试过的:

我有一个视图模型,我试图将其传递给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,然后...

ios swift cocoa-touch uitextfield swiftui
1个回答
0
投票

下面使您的自定义文本字段可操作...用于更新外部边界,希望这是这么长的描述的目标。

© www.soinside.com 2019 - 2024. All rights reserved.