Objective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]' 用于 UITextField

Posted

技术标签:

【中文标题】Objective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]\' 用于 UITextField【英文标题】:Objective-C -[__NSArrayM insertObject:atIndex:]: index 2 beyond bounds [0 .. 0]' for UITextFieldObjective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]' 用于 UITextField 【发布时间】:2016-02-25 09:48:55 【问题描述】:

我有一个表格视图,在我放置 UITextField 的两个部分中有两个部分。但是当我为每个 textField 使用标签时,它为两个部分共享相同的标签,因此我的应用程序崩溃了。如果第 1 部分包含 4 个 TextField,而第 2 部分包含大约 2 个 TextField。

- (void)textFieldDidEndEditing:(UITextField *)textField


    if (Array1) 
        [Array1 setObject:textField.text atIndexedSubscript:[textField tag]-1];
        NSLog(@"Array1 after edit: %@",Array1);
    

    if (Array2) 

        [Array2 setObject:textField.text atIndexedSubscript:[textField tag]-1]; // app crashing at this line
        NSLog(@"Array2 after edit: %@",Array2);
     

它给出了这个错误

* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM setObject:atIndex:]: index 2 beyond 界限 [0 .. 0]'

*** 首先抛出调用栈:

我的 taleView 代码是这样的

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 2;    //count of section

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
         if (section == 0 ) 
            return [Array1 count];
         else 
            return [Array2 count];
        
    

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath

    CustomCell *cell=(CustomCell *)[ProfileTable dequeueReusableCellWithIdentifier:@"Cell"];
        if (cell == nil) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomeCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    
    if (indexPath.section==0) 
    [cell.SInfoTxt setPlaceholder:[[ProfileTableArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
    cell.SInfoTxt.text=[Array1 objectAtIndex:indexPath.row];

     else 
    [cell.SInfoTxt setPlaceholder:[[profileTblCustomArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
    cell.SInfoTxt.text=[Array2 objectAtIndex:indexPath.row];

    
    cell.SInfoTxt.tag=indexPath.row+1;

    //set cell background clear color
    cell.backgroundColor=[UIColor clearColor];

    return cell;

【问题讨论】:

您如何以及在何处初始化 Array1 和 Array2 ?您是否从代码中的任何位置将 nil 设置为这些数组? 我在我的 .h 文件中将 Array1 和 Array2 初始化为 NSMutableArray,当我输入任何文本时,它会获取该 txt 并仅在我按此顺序单击第 1、2、3 个 UITextFiled 时才显示在我的文本文件中,并且但是如果我单击任何随机文本字段,它就会崩溃......而且我没有在这个问题中添加我的所有代码 【参考方案1】:

除了在UITextfield委托中使用标签,您可以使用它的框架原点来知道它的单元格索引路径。

- (void)textFieldDidEndEditing:(UITextField *)textField

    CGPoint origin = textField.frame.origin;
    CGPoint point = [textField convertPoint:origin toView:self.tableView];

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];

    if (indexPath.section==0) 
        [Array1 setObject:textField.text atIndexedSubscript:[textField tag]-1];
        NSLog(@"Array1 after edit: %@",Array1);
    

    if (indexPath.section==1) 
        [Array2 setObject:textField.text atIndexedSubscript:[textField tag]-1]; 
        NSLog(@"Array2 after edit: %@",Array2);
     

【讨论】:

【参考方案2】:

在这段代码中

cell.SInfoTxt.text=[Array1 objectAtIndex:indexPath.row];

cell.SInfoTxt.text=[Array2 objectAtIndex:indexPath.row];

如果每个数组的对象总数不同。

您必须在此委托方法 -numberOfRowsInSection 中设置不同的计数

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

【讨论】:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section if (section == 0) return [Array1 count ]; else 返回 [Array2 计数]; 我已经设置了这个 cell.SInfoTxt.tag=indexPath.row+1;这是两个部分的通用标签我如何为两个部分创建两个不同的标签... ProfileTableArray 和 profileTblCustomArray 的对象总数相同 Array1,Array2 ? 如果 Array1 有 4 个值但 ProfileTableArray 有 2 个值,当循环到索引 3 但 ProfileTableArray 只有 2 个值时,您使用 [Array1 count] 设置 numberofRowinSection,它现在可能会发生与您的错误相同的错误。 它们在array1和ProfileTableArray中的对象数量相同......对不起【参考方案3】:

您有两个数组用于两个部分。所以你可能在数组中有不同的计数。最好你这样使用。

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
         if (section == 0 ) 
            return [Array1 count];
         else 
            return [Array2 count];
        
    

    - (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        CustomCell *cell=(CustomCell *)[ProfileTable dequeueReusableCellWithIdentifier:@"Cell"];
            if (cell == nil) 
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomeCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        
        if (indexPath.section==0) 
            [cell.SInfoTxt setPlaceholder:[[ProfileTableArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
            cell.SInfoTxt.text=[Array1 objectAtIndex:indexPath.row];
            cell.SInfoTxt.tag=1000+indexPath.row; // We can easily identifies using tag.

         else 
            [cell.SInfoTxt setPlaceholder:[[profileTblCustomArray objectAtIndex:indexPath.row] valueForKey:@"FN"]];
            cell.SInfoTxt.text=[Array2 objectAtIndex:indexPath.row];
            cell.SInfoTxt.tag=2000+indexPath.row;

        

        return cell;
    

【讨论】:

是的,我已经写了这是我的代码......并且没有发布我的所有代码......实际上我面临标签问题。 cell.SInfoTxt.tag=indexPath.row+1;这是两个部分的通用标签我如何为两个部分创建两个不同的标签 所有视图都使用默认标记值 0 作为标记值。所以尝试另一个标签值。不要对所有子视图使用相同的标签值。请像这样使用它。 if(section == 0) cell.SInfoTxt.tag = 1000 + indexPath.row;否则 cell.SInfoTxt.tag = 2000 + indexPath.row; ok 并且在 - (void)textFieldDidEndEditing:(UITextField *)textField 我应该只使用 [textField tag] 或其他东西 如果不增加cell.SInfoTxt.tag=2000+indexPath.row中的值。你可以使用 if([textfield tag] >= 2000)int tagvalue= [textfield tag]-2000 else int tagvalue= [textfield tag]-1000

以上是关于Objective-C -[__NSArrayM insertObject:atIndex:]: 索引 2 超出边界 [0 .. 0]' 用于 UITextField的主要内容,如果未能解决你的问题,请参考以下文章

NSArrayM objectAtIndex:索引 6 超出范围

NSArrayM insertObject:atIndex:]: 对象不能为 nil

NSArrayM replaceObjectAtIndex:withObject: 对象不能为 nil'

Objective-C 使用 C++类

objective-c入门

Swift 3.0 令人兴奋,但Objective-C也有小改进--Objective-C的类属性