【问题标题】:Text Field Should Return, is this correct for ios7?文本字段应该返回,这对 ios7 是否正确?
【发布时间】:2014-02-10 20:59:57
【问题描述】:

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

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

【问题讨论】:

  • 如果您使用的是 IB(Interface Builder),您可以在此处设置委托,而不是在代码中。
  • 看起来不错。我做过类似的事情,而且效果很好。

标签: ios xcode ios7 delegates uitextfield


【解决方案1】:

一般来说你的代码没问题。

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

示例:控件从 UITextField 拖动到 ViewController 并选择“委托”。

resignFirstResponder 可以考虑到 ibe 的发生
重构代码:

-(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; 
}

【讨论】:

  • "您可以在此处设置委托,而不是在代码中。"请解释一下
  • 我添加了文字和图片。
【解决方案2】:

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

// 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; 
}

【讨论】:

  • 你在哪里看到:'nextUIControl'?
  • @Zaph 参见上面的编辑。如果您有任何问题,请随时问我。
  • 这是一个类还是类别?
  • @Esq 是一个新类,扩展了 UITextField 类,增加了一个类别
  • 如果有demo请提供
【解决方案3】:

我的 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; 
}

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

【讨论】:

  • 这看起来不像我的方法那么简单?
  • 在你的情况下,我认为它是一样的。对于这种方法,我看到了下一个案例:1)您没有将 IBOutlet 设置为您的 textFields,而是在 IB 中设置了标签和委托引用,并且在您的代码中仅实现了带有 switch-case 的委托方法。 2)你有一个未命名的文本字段数组——为了更清晰的代码——标签会很有用。
【解决方案4】:

以及上面的好答案。您仍然可以找到管理 textfield 所有内容的好图书馆。就像您在 tableview 中使用 textfields 时一样,在 collectionview 中使用 textfields 。 https://github.com/michaeltyson/TPKeyboardAvoiding。通过使用这个库,您可以轻松地为应用程序制作登录或注册表格

【讨论】:

    【解决方案5】:

    我在 Swift 中的解决方案:
    在 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
    }
    

    【讨论】:

      【解决方案6】:

      我将每个文本字段连续放置一个标签号。比如 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
      }
      

      【讨论】:

        猜你喜欢
        • 2016-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-11
        • 2023-03-22
        相关资源
        最近更新 更多