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

Posted

技术标签:

【中文标题】在 uiview 中有超过 1 个 uitextfield 的 iOS swift 委托【英文标题】:iOS swift delegate with more than 1 uitextfield in a uiview 【发布时间】:2015-06-03 20:58:07 【问题描述】:

我有一个 ios 应用,有一个 UIView 和三个 UITextField(超过 1 个) 我想了解我的 ViewController 类管理UITextField 的最佳实践是什么。

- 类 MainViewController: UIViewController, UITextFieldDelegate ?

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

【问题讨论】:

【参考方案1】:

最简单的方法是知道在委托方法中使用什么文本字段。 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?),如果您想知道更好的解决方案,请告诉我,我会更新我的答案。

【讨论】:

10个或20个字段怎么办?您能否更新您的答案。 有没有更好的解决方案?如果有人能写下所有可能的替代方案,那将是最好的。 @anatoliy_v 请写出多个字段的替代方案,这会很有帮助。 @VitaliyLitvinov 在下面回答了对任意数量的字段执行此操作的方法。 @Aashish 我已经在下面回答了一种对任意数量的字段执行此操作的方法。【参考方案2】:

最好的方法是使用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
;

【讨论】:

【参考方案3】:
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

【讨论】:

【参考方案4】:

这对我有用

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")
           
       
    

【讨论】:

以上是关于在 uiview 中有超过 1 个 uitextfield 的 iOS swift 委托的主要内容,如果未能解决你的问题,请参考以下文章

2 个 TextField,在 1 个 UIView 中有 2 个选择器

iOS 通过故事板将 UIView 锁定在导航栏下方和 UITableView 上方

如何检测对 UITableViewCell 的 UIView 的触摸超过一个部分?

Storyboard Constraints 设置 UIImageView 不超过屏幕的 50%

getGeoPoint() 方法在调用时返回 null。 Firebase 集合中有超过 1 个文档

计算第一个三角形数以在 python 中有超过 500 个除数