【问题标题】:How to step through multiple UITextFields如何逐步遍历多个 UITextField
【发布时间】:2013-07-06 11:46:21
【问题描述】:

我有四个 UITextFields 我想在 UIAlertView 中使用,目前这就是它的样子

我希望能够将每个框限制为 4 个字符,一旦每个字段达到 4 个字符的限制,然后我希望下一个 UITextField 成为第一响应者。

我也希望能够反向执行此操作,因此如果在第二个字段中没有可用字符时删除字符,请转到第一个并开始删除等。

目前我的代码非常草率,因为我只是想让这样的东西正常工作..所以这就是到目前为止的样子。

//提示用户在此处输入注册 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"请注册设备" message:@" " delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

UITextField *myTextField = [[UITextField alloc] initWithFrame:CGRectMake(12, 45, 53, 30)];

UITextField *myTextField1 = [[UITextField alloc] initWithFrame:CGRectMake(77, 45, 53, 30)];
UITextField *myTextField2 = [[UITextField alloc] initWithFrame:CGRectMake(142, 45, 53, 30)];
UITextField *myTextField3 = [[UITextField alloc] initWithFrame:CGRectMake(207, 45, 53, 30)];

// need to do something with first reasponder once 4 digits has been entered per box etc.
[myTextField becomeFirstResponder];

myTextField.placeholder =@"AAAA";
myTextField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
myTextField.textAlignment = NSTextAlignmentCenter;
myTextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

myTextField1.placeholder =@"AAAA";
myTextField1.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
myTextField1.textAlignment = NSTextAlignmentCenter;
myTextField1.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

myTextField2.placeholder =@"AAAA";
myTextField2.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
myTextField2.textAlignment = NSTextAlignmentCenter;
myTextField2.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

myTextField3.placeholder =@"AAAA";
myTextField3.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
myTextField3.textAlignment = NSTextAlignmentCenter;
myTextField3.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

[myTextField setBackgroundColor:[UIColor whiteColor]];
[myTextField1 setBackgroundColor:[UIColor whiteColor]];
[myTextField2 setBackgroundColor:[UIColor whiteColor]];
[myTextField3 setBackgroundColor:[UIColor whiteColor]];

[alert addSubview:myTextField];
[alert addSubview:myTextField1];
[alert addSubview:myTextField2];
[alert addSubview:myTextField3];

[alert show];

任何帮助将不胜感激。

// 更新: 这就是我尝试使用委托方法的方式

//.h
<UITextFieldDelegate>

//.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//..
    [self.myTextField setDelegate:self];
    [self.myTextField1 setDelegate:self];
    [self.myTextField2 setDelegate:self];
    [self.myTextField3 setDelegate:self];
//..
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
     NSLog(@"yay");
    return NO;
}

【问题讨论】:

    标签: iphone ios objective-c uitextfield uialertview


    【解决方案1】:

    更新

    我尝试了下面的代码,并且确实有效,但出于某种原因,如果您更改 FirstResponder,文本将不会被写入。所以我修改了功能。你应该这样做:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        if(textField.text.length >= MAX_LENGTH)
            return NO;
    
        if((textField.text.length + string.length) >= MAX_LENGTH)
        {
            int currentTag = textField.tag;
    
            if(currentTag == 4)
                return YES;
    
            UITextField *newTextField = (UITextField *) [textField.superview viewWithTag:(currentTag+1)];
            [newTextField becomeFirstResponder];
            textField.text = [textField.text stringByAppendingString:string];
        }
        return YES; //you probably want to review this...
    }
    

    无论如何,当您不想删除内容时,这不起作用,但如果您更改代码以检查更改范围,这很容易解决。

    我做了一个示例项目,你可以在这里获取:TextFieldTest


    我就是这样做的,使用文本字段委托,您可以检查新插入的字符,如果达到最大值,则移动到下一个文本字段:

    static int MAX_LENGTH = 4;
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
       if((textField.text.length + string.length) >= MAX_LENGTH)
       {
           //Get next TextField... A simple way to do this:
           UITextField *newTextField = [textField.superview viewWithTag:(textField.tag+1)];
           [newTextField becomeFirstResponder];
           //remember to set the tags in order
       }
       return YES; //you probably want to review this... 
    }
    

    (如果没有编译,抱歉我直接写到这里了)

    祝你好运!

    【讨论】:

    • 好的,我将尝试处理这个问题。只是我的 shouldChangeCharactersInRange 委托方法没有被调用,即使我已将 UITextFieldDelegate 添加到标题中并且还在 viewDidLoad 方法中设置了委托。
    • 我已经用底部的示例代码更新了我的问题,展示了我如何尝试使用文本字段委托。
    • 您在 AppDelegate 做所有事情?不建议这样做,但除此之外,我看不出有什么问题,抱歉。
    • 好的,我已经从 AppDelegate 中删除了它,因为我认为这可能是在其他地方阅读评论后出现的问题。我已经在它自己的 viewController 中设置了它,我从 appDelegate 调用...仍然运气不好,委托方法没有被访问..到底发生了什么哈哈
    • 我将尝试将文本框从警报视图中取出,然后查看代理是否有效
    【解决方案2】:

    您可以为这些文本字段设置委托,并在委托方法中实现您的业务逻辑(将其中一个文本字段设置为新的第一响应者)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 2014-09-27
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多