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

时间:2014-02-10 20:59:57

标签: ios xcode ios7 delegates uitextfield

我搜索并看到了很多关于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; 
}

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

6 个答案:

答案 0 :(得分:11)

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

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

示例:控制从UITextField拖动到ViewController并选择“delegate”。 enter image description here

可以将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属性。 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
}