0

我有UIViewController几个UITextFields。当点击一个文本字段时,它应该呈现条码扫描视图控制器。扫描完成后,我的条码扫描视图控制器消失(使用“dismissViewcontroller”),扫描值应输入到我点击的文本字段中。这工作正常。我已经为每个文本字段设置了这样的委托。

[field addTarget:metrixUIViewControllerIn action:@selector(executeScriptOnTextFieldChange:) forControlEvents:UIControlEventEditingChanged];

问题是这样的:

可以说我已经设置了一个在这个executeScriptOnTextFieldChange方法中显示的警报。一旦我点击了第一个文本字段,条码扫描器就会出现。一旦我扫描了条形码扫描仪,就会关闭并设置第一个文本字段的值并触发警报。没关系。但是,如果通过点击第二个文本字段进行扫描,字符串将设置为该文本字段并触发与第二个文本字段相关的警报,也会触发与第一个文本字段相关的警报。我想停止这种情况。有没有办法禁用一个文本字段的委托?发生这种情况是因为我正在刷新viewDidAppear. 但我也必须这样做。请帮我。

4

1 回答 1

0

textField 的 UIControlEventEditingChanged 可以触发许多不同的事件,这些事件甚至与该 textField 没有直接关系,而是间接相关。

例如,当您的 ViewController 显示barcodeScanner 时,它可能会在 textField 上触发“resignFirstResponder”事件。同样,当第二个文本字段被点击时,导致第二个成为第一响应者,而第一个遭受“resignFirstResponder”。

我建议尝试在您的 textField 中使用 UITapGestureRecognizer 。例子:

斯威夫特 4

@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()
    self.textField.tag = 1
    self.textField.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(fireTextField(_:))))
}

@objc func fireTextField(_ sender: UIGestureRecognizer){
    let view = sender.view
    guard view != nil else{
        //Do nothing
        return
    }
    let condition = view!.tag == 1
    if condition{
        //or do whatever other stuff you need
        self.textField.becomeFirstResponder()
    }else{
        //Whatever for other textFields
    }
}

这样,您可以使用“tag”属性来确定触发哪个 textField 并调整“条件”。您还可以使用“标签”通过开关过滤流。

不确定这是否真的有帮助,因为我需要有关您需要完成的流程的更多信息。希望它有帮助!

于 2018-01-17T08:11:25.443 回答