在Swift中按回车键切换文本字段

luc*_*uez 60 iphone ios swift xcode6

我正在设计一个iOS应用程序,我希望在我的iPhone中按下返回键时,它会将我引导到下一个文本字段.

我发现了几个类似的问题,并且有很好的答案,但它们恰好都在Objective-C中,我正在寻找Swift代码,现在这就是我现在所拥有的:

func textFieldShouldReturn(emaillabel: UITextField) -> Bool{
    return true
}
Run Code Online (Sandbox Code Playgroud)

它被放置在连接的文件和包含文本字段的UIView的控制器中,但我不确定这是不是正确的地方.

我基本上是新手,所以解释每一个小步骤,否则我会设法弄乱它.此外,我正在使用最新版本的Xcode,如果这有任何区别.

好的,所以我试了这个并得到了这个错误:
//could not find an overload for '!=' that accepts the supplied arguments

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let nextTag: NSInteger = textField.tag + 1
    // Try to find next responder
    let nextResponder: UIResponder = textField.superview!.viewWithTag(nextTag)!
    if (nextResponder != nil) {
        // could not find an overload for '!=' that accepts the supplied arguments

        // Found next responder, so set it.
        nextResponder.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
    }
    return false // We do not want UITextField to insert line-breaks.
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢好朋友!!

Cal*_*leb 132

Swift 3.0(检查以前版本的编辑历史记录):

class ViewController: UIViewController,UITextFieldDelegate {
   // Link each UITextField (Not necessary if delegate and tag are set in Interface Builder)
   @IBOutlet weak var someTextField: UITextField!

   override func viewDidLoad() {
      super.viewDidLoad()
      // Do the next two lines for each UITextField here or in the Interface Builder
      someTextField.delegate = self
      someTextField.tag = 0 //Increment accordingly
   }

   func textFieldShouldReturn(_ textField: UITextField) -> Bool {
      // Try to find next responder
      if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
         nextField.becomeFirstResponder()
      } else {
         // Not found, so remove keyboard.
         textField.resignFirstResponder()
      }
      // Do not add a line break
      return false
   }
}
Run Code Online (Sandbox Code Playgroud)

确保您的UITextField代理已设置且标记正确递增.这也可以通过Interface Builder完成.

这是我发现的Obj-C帖子的链接:如何浏览文本字段(下一个/完成按钮)

  • @meteorSD 带有一系列文本字段?我不确定这两种做法是否比另一种更好。当主要依赖于 Interface Builder 时,标签似乎是最简单的方法。 (2认同)

Vin*_*ino 26

斯威夫特4

您可以轻松切换到另一个TextField.

  • ViewController中添加UITextFieldDelegate和添加textFieldShouldReturn(_:)方法
  • Interface Builder中TextField拖动到ViewController.然后选择属性.注意:对所有TextField执行此操作delegate
  • IBOutlet为所有TextField创建一个

    class ViewController: UIViewController, UITextFieldDelegate {
    
      @IBOutlet weak var txtFieldName: UITextField!
      @IBOutlet weak var txtFieldEmail: UITextField!
      @IBOutlet weak var txtFieldPassword: UITextField!
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
      }
    
      func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == txtFieldName {
           textField.resignFirstResponder()
           txtFieldEmail.becomeFirstResponder()
        } else if textField == txtFieldEmail {
           textField.resignFirstResponder()
           txtFieldPassword.becomeFirstResponder()
        } else if textField == txtFieldPassword {
           textField.resignFirstResponder()
        }
       return true
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 效果很好。但是,如果调用 beginFirstResponder() ,则避免使用 resignFirstResponder() 会很好,因为我的应用程序在键盘打开和返回时显示一些抖动。 (2认同)

小智 13

我建议你应该使用switch语句textFieldShouldReturn(_:).

// MARK: UITextFieldDelegate

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    switch textField {
    case nameTextField:
        phoneTextField.becomeFirstResponder()
    case phoneTextField:
        emailTextField.becomeFirstResponder()
    case emailTextField:
        descriptionTextField.becomeFirstResponder()
    default:
        textField.resignFirstResponder()
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)


lib*_*bec 8

这种方法需要在表视图和集合视图中进行一些更改,但我认为它对于简单的表单是可以的.

将您连接textFields到一个IBOutletCollection,按y坐标对其进行排序,然后textFieldShouldReturn(_:)跳转到下一个文本字段,直到结束:

@IBOutlet var textFields: [UITextField]!

...

textFields.sortInPlace { $0.frame.origin.y < $1.frame.origin.y }

...

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if let currentIndex = textFields.indexOf(textField) where currentIndex < textFields.count-1 {
        textFields[currentIndex+1].becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
    }
    return true
}    
Run Code Online (Sandbox Code Playgroud)

或者只看示例项目(xcode 7 beta 4)


Tie*_*Wei 6

快速且以编程方式

class MyViewController: UIViewController, UITextFieldDelegate {

    let textFieldA = UITextField()
    let textFieldB = UITextField()
    let textFieldC = UITextField()
    let textFieldD = UITextField()

    var textFields: [UITextField] {
        return [textFieldA, textFieldB, textFieldC, textFieldD]
    }

    override func viewDidLoad() {
        // layout textfields somewhere 
        // then set delegate
        textFields.forEach { $0.delegate = self }
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if let selectedTextFieldIndex = textFields.firstIndex(of: textField), selectedTextFieldIndex < textFields.count - 1 {
            textFields[selectedTextFieldIndex + 1].becomeFirstResponder()
        } else {
            textField.resignFirstResponder() // last textfield, dismiss keyboard directly
        }
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)


col*_*ace 5

Caleb 的Swift 4.0版本

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let nextField = self.view.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

PStextField.superview?不适合我