集合< __ NSArrayM:0x837cb90>在被列举时被突变

时间:2013-06-22 15:34:32

标签: ios objective-c uitextfield

我试图在UItableview中从一个Uitextfield跳转到另一个单击Next按钮,它正在向我抛出Collection< __ NSArrayM:0x837cb90>的错误消息。在被枚举的时候发生了变异。以前的按钮工作正常。

当我是tableview的第二个最后一个单元格并且想要移动最后一个单元格时,会发生这种情况。 以下是一些代码段:

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

    NSString *CellIdentifier = @"Cell";
    NSUInteger row = [indexPath row];

    CustomCell *Cell = ( CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (Cell == nil)
    {

        // a new cell needs to be created
        Cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault
                                         reuseIdentifier:CellIdentifier] ;
        Cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    NSDictionary* product = [dataArray objectAtIndex:indexPath.row];
    Cell.lblProductContName.text=[product objectForKey:@"ProductContentsandName"];
    Cell.txtQty.delegate = self;
    Cell.txtQty.tag = 100 + row;
    Cell.txtQty.text=[txtFieldArray objectAtIndex:indexPath.row];

    return Cell;

}

代码在下一个按钮,上一个和完成按钮。

- (void)onPrev:(id)sender
{
    NSArray *visiableCells = [self.myTableView visibleCells];
    [visiableCells enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        CustomCell *cell = (CustomCell *)obj;

        if (cell.txtQty.tag == selectedCellIndex) {
            [cell.txtQty resignFirstResponder];
        } else if (cell.txtQty.tag == selectedCellIndex - 1){
            [cell.txtQty becomeFirstResponder];
            *stop = YES;
        }

    }];

}

- (void)onNext:(id)sender
{

    NSArray *visiableCells = [self.myTableView visibleCells];


    [visiableCells enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            CustomCell *cell = (CustomCell *)obj;
            if (cell.txtQty.tag == selectedCellIndex) {
                [cell.txtQty resignFirstResponder];
            } else if (cell.txtQty.tag == selectedCellIndex + 1){
                [cell.txtQty becomeFirstResponder];
                *stop = YES;
            }

        }];

}

- (void)onDone:(id)sender
{
    NSArray *visiableCells = [self.myTableView visibleCells];

    [visiableCells enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        CustomCell *cell = (CustomCell *)obj;
        if (cell.txtQty.tag == selectedCellIndex) {
            [cell.txtQty resignFirstResponder];
        }


    }];

}

2 个答案:

答案 0 :(得分:4)

通过向表视图内的文本字段发送becomeFirstResponder消息,可以使其滚动。通过滚动,visibleCells数组会发生变化。因为在枚举此数组时会发生这种情况,所以会得到异常。

但是你不需要迭代可见细胞。只需使用UITableView方法cellForRowAtIndexPath:获取下一个或上一个单元格。此外,您不必自己调用resignFirstResponder。当新视图成为第一个响应者时,旧视图会自动退出。

答案 1 :(得分:1)

远射但是,可能是因为键盘被隐藏/显示或者我想象的另一个UI约束取决于单元格的数量(尝试使用100个单元格可能会使其在最后一个适合屏幕的单元格中崩溃而不会滚动)和表视图大小,当您调用resign /成为第一响应者时,可见单元格的数量变异(也就是说,表视图显示不同的单元格)。首先尝试制作数组的副本:

NSArray *visibleCells = [[self.myTableView visibleCells] copy];