文本字段应该返回,这对ios7是否正确?

我搜索并看到了很多关于textFieldShouldReturn方法的答案。 其中一半是过时的,一些在不同的情况下工作,一些没有彻底解释。 我不确定执行此任务的最佳方式是什么,它可以工作,但我认为可能有一种更简单的方法。

到目前为止,我的代码是:

在头文件上:

@interface ClassName : SomeUIViewController  

在实现文件中:

 @interface ClassName() @property (weak, nonatomic) IBOutlet UITextField *firstOne; @property (weak, nonatomic) IBOutlet UITextField *secondOne; @property (weak, nonatomic) IBOutlet UITextField *thirdOne; @property (weak, nonatomic) IBOutlet UITextField *fourthOne; @property (weak, nonatomic) IBOutlet UITextField *fifthOne; @end -(void)viewDidLoad{ self.firstOne.delegate = self; self.secondOne.delegate = self; self.thirdOne.delegate = self; self.fourthOne.delegate = self; self.fifthOne.delegate = self; } -(BOOL)textFieldShouldReturn:(UITextField*)textField; { if (textField == self.firstOne) { [textField resignFirstResponder]; [self.secondOne becomeFirstResponder]; } else if (textField == self.secondOne) { [textField resignFirstResponder]; [self.thirdOne becomeFirstResponder]; } else if (textField == self.thirdOne) { [textField resignFirstResponder]; [self.fourthOne becomeFirstResponder]; } else if (textField == self.fourthOne) { [textField resignFirstResponder]; [self.fifthOne becomeFirstResponder]; } else if (textField == self.fifthOne) { [textField resignFirstResponder]; } return NO; } 

这是正确的还是有更好的方法来完成这项任务?

一般来说,你的代码很好。

如果您使用的是IB(Interface Builder),则可以在那里设置委托而不是代码。

示例:控制从UITextField拖动到ViewController并选择“委托”。 在此处输入图像描述

可以将resignFirstResponder考虑在内
重构代码:

 -(BOOL)textFieldShouldReturn:(UITextField*)textField; { [textField resignFirstResponder]; if (textField == self.firstOne) { [self.secondOne becomeFirstResponder]; } else if (textField == self.secondOne) { [self.thirdOne becomeFirstResponder]; } else if (textField == self.thirdOne) { [self.fourthOne becomeFirstResponder]; } else if (textField == self.fourthOne) { [self.fifthOne becomeFirstResponder]; } return NO; } 

我建议你用另一种方法来做这件事。 您可以创建一个新类,使用类别扩展UITextField类,并添加您自己的属性以在UIControl之间导航。

 // Class name UITextField+Navigation.h @interface UITextField (Navigation) @property (weak, nonatomic) IBOutlet id nextUIControl; @end 

IBOutlet用于如果您想将该属性与故事板一起使用,您可以根据需要省略它。

 // UITextField+Navigation.m #import "UITextField+Navigation.h" #import  static char defaultHashKey; @implementation UITextField (Navigation) - (id)nextUIControl { return objc_getAssociatedObject(self, &defaultHashKey); } - (void)setNextUIControl:(id)nextUIControl { objc_setAssociatedObject(self, &defaultHashKey, nextUIControl, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end 

在您的类中,导入扩展的UITextField + Navigation.h类,以便您可以访问您创建的属性。 在viewDidLoad方法中,您只需指定下一个UITextField的值

 #import "UITextField+Navigation.h" @interface ClassName() @property (weak, nonatomic) IBOutlet UITextField *firstOne; @property (weak, nonatomic) IBOutlet UITextField *secondOne; @property (weak, nonatomic) IBOutlet UITextField *thirdOne; @property (weak, nonatomic) IBOutlet UITextField *fourthOne; @property (weak, nonatomic) IBOutlet UITextField *fifthOne; @end - (void)viewDidLoad { self.firstOne.nextUIControl = self.secondOne; self.secondOne.nextUIControl = self.thirdOne; etc... } 

或者,如果您使用的是Storyboard,则可以将控制器链接到nextUIControl属性。 nextUIControl 并在textFieldShouldReturn:

 -(BOOL)textFieldShouldReturn:(UITextField*)textField; { [textField.nextUIControl becomeFirstResponder]; return NO; } 

我的50美分。 我使用下一个方法。 UIKit对象(UIView,UITextField和其他)具有名为“tag”的可重写属性。 这是开发人员使用的属性。

 typedef NS_ENUM (NSInteger, SSSActionType) { TextFieldTag1= 100, TextFieldTag2= 110, TextFieldTag3= 120 }; - (void)customizeFields { textField1.tag = TextFieldTag1; textField1.delegate = self; // setting tags for all fields } 

在委托方法中比较整数标记而不是实例对象:

 -(BOOL)textFieldShouldReturn:(UITextField*)textField { [textField resignFirstResponder]; switch (textField.tag) { case TextFieldTag1: // do stuff break; case TextFieldTag2: break; case TextFieldTag3: break; default: break; } return NO; } 

看起来像第一种方法,但我更喜欢显式标签名称和清晰的代码

以及以上的好答案。 你仍然可以找到管理文本域所有东西的好图书馆。 比如当你在tableview中使用textfields时,在collectionview中使用textfields。 https://github.com/michaeltyson/TPKeyboardAvoiding 。 通过使用此库,您可以轻松地登录或注册应用程序的表单

我在Swift中的解决方案:
在TextField和下一个TextField之间创建字典映射。

 // to find the next text field private lazy var textFields: [UITextField: UITextField] = [self.firstTF: self.secondTF, self.secondTF: self.thirdTF] func textFieldShouldReturn(textField: UITextField) -> Bool { textFields[textField]?.becomeFirstResponder() return true } 

我把每个文本字段都连续标记了。 像0,1,2,3..n那么用法是:

 func textFieldShouldReturn(textField: UITextField) -> Bool { let tag = textField.tag if (tag < n) { let textfieldNew = theView.viewWithTag(tag + 1) as! UITextField textfieldNew.becomeFirstResponder() } else { textField.resignFirstResponder() } return true }