我搜索并看到了很多关于textFieldShouldReturn方法的答案。其中一半是过时的,一些在不同的情况下工作,一些没有彻底解释。我不确定执行此任务的最佳方式是什么,它可以工作,但我认为可能有一种更简单的方法。
到目前为止我的代码:
在标题文件中:
@interface ClassName : SomeUIViewController <UITextFieldDelegate>
在实施文件中:
@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;
}
这是正确的还是有更好的方法来完成这项任务?
答案 0 :(得分:11)
一般来说,你的代码很好。
如果您使用的是IB(Interface Builder),则可以在那里设置委托而不是代码。
示例:控制从UITextField拖动到ViewController并选择“delegate”。
可以将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;
}
答案 1 :(得分:2)
我建议你用另一种方法来做这件事。您可以创建一个新类,使用类别扩展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 <objc/runtime.h>
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属性。
并在textFieldShouldReturn:
-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
[textField.nextUIControl becomeFirstResponder];
return NO;
}
答案 2 :(得分:2)
我的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;
}
看起来像第一种方法,但我更喜欢显式标签名称和清除代码
答案 3 :(得分:1)
以及以上的好答案。你仍然可以找到管理文本域所有东西的好图书馆。比如当你在tableview中使用textfields时,在collectionview中使用textfields。 https://github.com/michaeltyson/TPKeyboardAvoiding。通过使用此库,您可以轻松登录或注册应用程序表单
答案 4 :(得分:0)
我在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
}
答案 5 :(得分:0)
我将每个文本字段连续放置一个标记号。比如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
}