【问题标题】:Storyboard, Event listener when UItextfield.text value is changed from button action故事板,当 UItextfield.text 值从按钮操作更改时的事件侦听器
【发布时间】:2021-12-31 20:20:46
【问题描述】:

UITextFieldDelegate 方法只有在我们通过键盘输入数据到文本字段时才有效。但是我们我改变了文本字段的值。任何按钮操作的文本都没有触发其委托方法。我还尝试添加客观的乐趣来监听值的变化,但它们也仅在文本字段从键盘接收到输入时才起作用。

     override func viewDidLoad() {
           super.viewDidLoad() 
           txtMinute.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
       }

       @objc func textFieldDidChange(_ textField: UITextField) {
            print(textField.text)
            enableEditButton()
        }

       @IBAction func change_minutes(_ sender: Any) {
        
           txtMinute.text = "123"
        
       }

关于如何在按钮操作上列出文本字段更改的任何建议?

【问题讨论】:

    标签: ios swift xcode storyboard swift5


    【解决方案1】:

    尝试以下方法:

    override func viewDidLoad() {
        super.viewDidLoad()
        txtMinute.delegate = self
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let oldText = textField.text, let range = Range(range, in: oldText) else {
            return true
        }
        
        let newText = oldText.replacingCharacters(in: range, with: string)
        print(newText)
        return true
    }
    

    【讨论】:

      【解决方案2】:

      TextField 委托方法仅在您通过键盘输入时调用,假设如果您希望在使用自定义数字键盘时调用这些委托方法,您需要像下面一样手动调用

      @IBAction func change_minutes(_ sender: Any) {
      
          if let selectedRange = txtMinute.selectedTextRange {
                  let range=txtMinute.rangeFromTextRangeForInsertion(textRange: selectedRange)
                  txtMinute.delegate?.textField?(txtMinute, shouldChangeCharactersIn: range, replacementString: sender.titleLabel?.text ?? "")       
              }
       }
          
         }
      
       Extension UITextFieldDelegate{
       func rangeFromTextRangeForInsertion(textRange:UITextRange) -> NSRange {
              let cursorPosition = self.offset(from: self.beginningOfDocument, to: textRange.start)
              let length = self.offset(from: textRange.start, to: textRange.end)
              
              return NSMakeRange(cursorPosition, length)
          }
      }
      
          //Your TextField Delegate Method
      extension ViewController:UITextFieldDelegate{
          func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                  enableEditButton()
                  return true
        }
      }
      

      【讨论】:

      • @Qazi Ammar,你试过上面的代码吗
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2020-11-25
      • 2014-01-07
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多