UIAlertView 错误超出文本字段数组的范围但未使用文本字段

Posted

技术标签:

【中文标题】UIAlertView 错误超出文本字段数组的范围但未使用文本字段【英文标题】:UIAlertView error outside of the bounds of the array of a text field but not using textfields 【发布时间】:2013-04-26 09:42:58 【问题描述】:

我正在使用UIAlertView,但收到以下错误消息:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“textFieldIndex (0) 超出了文本字段数组的范围”

但是我的UIAlertView 中没有textFields,而且我从来没有在某个地方访问过它们...

这是我的代码:

alertNewVersion = [[UIAlertView alloc] initWithTitle: @"Update"
                                            message: @"There is a new version"
                                            delegate: self
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:@"Cancel",nil];
[alertNewVersion setAlertViewStyle:UIAlertViewStyleDefault];
alertNewVersion.tag = 1;
[alertNewVersion show];

但是,当我将“delegate:self”更改为“delegate:nil”时,它不会因错误而崩溃,但我的委托函数当然不起作用......知道问题是怎么回事吗?

编辑:

第二个 UIAlertView:

- (IBAction)startPushed:(id)sender 

    message = [[UIAlertView alloc] initWithTitle:@"test."
                                        message:nil
                                        delegate:self
                                        cancelButtonTitle:nil
                                        otherButtonTitles:@"OK", nil];

    [message setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput];
    [[message textFieldAtIndex:1] setSecureTextEntry:NO];
    [[message textFieldAtIndex:0] setPlaceholder:@"xx"];
    [[message textFieldAtIndex:1] setPlaceholder:@"xxx"];
    message.tag = 2;
    [message show];


委托方法:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 


if(alertView.tag == 1) // alertNewVersion
    if (buttonIndex == 0)  //button "OK" clicked
       NSLog(@"test");
    



if(alertView.tag == 2) // Message

    if (buttonIndex == 0)  //button "OK" clicked
        NSString *Name = [[message textFieldAtIndex:0] text];
        [[NSUserDefaults standardUserDefaults] setObject:Name forKey:@"xx"]; 

        NSString *Class = [[message textFieldAtIndex:1] text];
        [[NSUserDefaults standardUserDefaults] setObject:Class forKey:@"xxx"]; 
    



【问题讨论】:

嗯,很明显,问题出在你的委托函数上。你为什么不展示你在那里做什么?我打赌你正在使用 textFieldWithIndex 请贴出应用崩溃的代码... 我认为您在同一个课程中使用了多个警报视图,对吧?? 请贴出alertView委托方法的clickedButtonAtIndex方法... 在抛出异常时添加断点。这应该会为您提供崩溃的确切位置。 【参考方案1】:

在这里为每个UIAlertView 设置不同的tag 并使用下面的代码...

您会收到错误,因为当您使用 alertNewVersion UIAlertView 时,它会在 0 索引处找到 textField,而这里它没有 UITextFields 的数组并且应用程序在此处崩溃,因此请使用以下条件.. .

更新:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    if (alertView.tag == 1) 
        if (buttonIndex == 1) 
           /// do nothing here
        
    
    else if (alertView.tag == 2)
        NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
       if([title isEqualToString:@"Ok"])
       
           UITextField *txtName = [alertView textFieldAtIndex:0];
           UITextField *txtClass = [alertView textFieldAtIndex:1];
           NSLog(@"Name: %@\nClass: %@", txtName.text, txtClass.text);
       
    


在上面的第一个代码中使用此代码...

UIAlertView *alt = [[UIAlertView alloc]initWithTitle:@"Update" message:@"There is a new version" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
alt.tag = 1;
[alt show];
[alt release];

对于消息,请参见下面的代码...

//show alertview for message
- (IBAction)startPushed:(id)sender 
    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"test."
                                                      message:nil
                                                     delegate:self
                                            cancelButtonTitle:nil
                                            otherButtonTitles:@"Ok", nil];



    [message setAlertViewStyle:UIAlertViewStyleLoginAndPasswordInput];
    UITextField *text1 = [message textFieldAtIndex:0];
    text1.placeholder=@"xxx";
    [[message textFieldAtIndex:1] setSecureTextEntry:NO];
    UITextField *text2= [message textFieldAtIndex:1];
    text2.placeholder=@"xxx";
    message.tag = 2;
    [message show];

【讨论】:

@nonuma 您还在 .h 文件中添加了 UIAlertViewDelegate 吗?检查 是的,我做到了,因为带有 textFields 输入的 UIAlertView 工作,它只是当我添加正常的 UIAlertView 时它给了我错误... 看到我更新了我的答案,只是使用该代码而不是你 alloc alertNewVersion alertView.. 我确信它的问题并在 clickedButtonAtIndex 中崩溃了.. 我在我的项目中而不是我的项目中复制了您的答案,但正如我所说,即使我注释掉了另一个 alertview 并注释掉了整个 alertView 委托方法,它仍然是同样的错误 它必须有效,伙计..尝试更改一些不同的标签,如设置 111 或 222 标签...我在 1 类中使用了许多 alertview,它的工作方式类似于上面...【参考方案2】:

在下面的方法中:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 

提供您的警报视图名称并执行您想要的任何操作,如下所示:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
 

    if(alertView == alertNewVersion)
     
       
    if(alertView == message)
     
     

【讨论】:

以上是关于UIAlertView 错误超出文本字段数组的范围但未使用文本字段的主要内容,如果未能解决你的问题,请参考以下文章

在 UIAlertView 试图查看两个文本字段。它显示文本字段数组iOS7的错误范围

如果超出范围,防止 jQuery UI datepicker 更改文本字段的值

索引超出了数组拆分函数的范围[重复]

为啥我没有得到数组超出范围错误? [复制]

Swift 致命错误:数组索引超出范围

错误:Postgresql 中的日期/时间字段值超出范围