在Swift中按下回车键之间切换文本字段
我正在devise一个iOS应用程序,我希望当我的iPhone按下回车键时,它会指引我到下一个文本字段。
我发现了一些类似的问题,并且有很好的答案,但是它们都只是在Objective-C中,我正在寻找Swift代码,现在这是我现在使用的:
func textFieldShouldReturn(emaillabel: UITextField) -> Bool{ return true }
它被放置在连接的文件和包含文本字段的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. }
在此先感谢好朋友!
Swift 3.0 (查看以前版本的编辑历史logging):
class ViewController: UIViewController,UITextFieldDelegate { //Link each UITextField @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do this for each UITextField textField.delegate = self textField.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 } }
确保你的UITextField
委托被设置,并且标签正确地递增。 这也可以通过Interface Builder完成。
这里有一个链接到我发现的Obj-Cpost: 如何浏览文本框(Next / Donebutton)
这种方法需要在表视图和集合视图中进行一些更改,但是对于我猜测的简单表单来说,这是可以的。
连接你的textFields
到一个IBOutletCollection
,按y坐标sorting,在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 }
或者看看示例项目 (xcode 7 beta 4)
只需在textFieldShouldReturn
方法中使用UIResponder类的becomeFirstResponder()
方法即可。 每个UIView
对象都是UIResponder
的子类。
if self.emaillabel.isEqual(self.anotherTextField) { self.anotherTextField.becomeFirstResponder() }
你可以在这里find更多有关becomeFirstResponder()
方法的信息 。
我已经尝试了很多代码,最后这在Swift 3.0中为我工作最新[2017年3月]
“ViewController”类应该inheritance“UITextFieldDelegate”来使这个代码工作。
class ViewController: UIViewController,UITextFieldDelegate
添加文本字段与正确的标签nuber和这个标签号码是用来采取控制适当的文本字段基于增量标签号分配给它。
override func viewDidLoad() { userNameTextField.delegate = self userNameTextField.tag = 0 userNameTextField.returnKeyType = UIReturnKeyType.next passwordTextField.delegate = self passwordTextField.tag = 1 passwordTextField.returnKeyType = UIReturnKeyType.go }
在上面的代码中,“returnKeyType = UIReturnKeyType.next”在哪里将使键盘返回键显示为“下一步”,你也有其他select作为“join/去”等,根据您的应用程序更改值。
这个“textFieldShouldReturn”是UITextFieldDelegate控制的方法,在这里我们有下一个字段select基于标记值增量
func textFieldShouldReturn(_ textField: UITextField) -> Bool { if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField { nextField.becomeFirstResponder() } else { textField.resignFirstResponder() return true; } return false }
最简单的方法来改变下一个文本字段是不需要长代码
override func viewDidLoad() { super.viewDidLoad() emailTextField.delegate = self passwordTextField.delegate = self } func textFieldShouldReturn(_ textField: UITextField) -> Bool { if textField == emailTextField { passwordTextField.becomeFirstResponder() }else { passwordTextField.resignFirstResponder() } return true }
纯粹主义者不喜欢使用标签的一种替代方法,并希望UITextField委托是单元格以保持组件分离或单向…
-
创build一个新的协议来链接单元格和TableViewController。
protocol CellResponder { func setNextResponder(_ fromCell: UITableViewCell) }
-
将协议添加到您的单元格,其中TextField委托也是单元格(我在故事板中执行此操作)。
class MyTableViewCell: UITableViewCell, UITextFieldDelegate { var responder: CellResponder? func textFieldShouldReturn(_ textField: UITextField) -> Bool { responder?.setNextResponder(self) return true } }
-
使您的TableViewController符合CellResponder协议(即
class MyTableViewController: UITableViewController, CellResponder
)并实现该方法,如你所愿。 即如果你有不同的细胞types,那么你可以做到这一点,同样你可以通过IndexPath,使用标签等。不要忘记在cellForRow中设置cell.responder = self
。func setNextResponder(_ fromCell: UITableViewCell) { if fromCell is MyTableViewCell, let nextCell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? MySecondTableViewCell { nextCell.aTextField?.becomeFirstResponder() } .... }