iOS swift 在 uiview 中委托超过 1 个 uitextfield

iOS swift delegate with more than 1 uitextfield in a uiview

我有一个 iOS 应用程序,有一个 UIView 和三个 UITextField(超过 1 个) 我想了解我的 class ViewController 管理 UITextField.

的最佳实践是什么

- class MainViewController: UIViewController, UITextFieldDelegate ?

我想知道,因为我有不止一个 UITextField 而只有一个 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool

最简单的方法是知道在委托方法中使用什么文本字段。 IE。你有 3 个文本字段:field1、field2、field3,当调用委托时你可以检测到要做什么:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if textField == field1 {
        // do something
    } else if textField == field2 {
        // do something
    } else if textField == field3 {
        // do something
    }
  return true
}

不要忘记将所有字段的委托设为自己:field1.delegate = self

在你的情况下它会工作得很好。

如果你有更多的字段(10、20?),如果你想知道更好的解决方案,请告诉我,我会更新我的答案。

最好的方法是使用 tag 属性。

Apple Docs 上看到:

- (void)textFieldDidEndEditing:(UITextField *)textField {

    switch (textField.tag) {
        case NameFieldTag:
            // do something with this text field
            break;
        case EmailFieldTag:
             // do something with this text field
            break;
        // remainder of switch statement....
    }
}

enum {
    NameFieldTag = 0,
    EmailFieldTag,
    DOBFieldTag,
    SSNFieldTag
};
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    switch textField {
    case field1:
       // do something 
    case field2:
       // do something 
    case field3:
       // do something 
    }
  return true
}

这对我有用

import UIKit

class WeatherViewController: UIViewController,UITextFieldDelegate {

    @IBOutlet weak var conditionImageView: UIImageView!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var cityLabel: UILabel!
    
    @IBOutlet weak var searchInputField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.searchInputField.delegate=self
        // Do any additional setup after loading the view.
    }

    @IBAction func searchButtonClicked(_ sender: UIButton) {
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == searchInputField {
            print("Changes done in searchTextField")
        }
        searchInputField.resignFirstResponder() // it hides the keyboard
           performAction()
           print(" Inside textFieldShouldReturn")
           return true
       }
       
      
       func performAction() {
         print(" Perform action called")
           
       }
    
}