【问题标题】:Collection <__NSArrayM: 0x837cb90> was mutated while being enumerated集合 <__NSArrayM: 0x837cb90> 在枚举时发生了突变
【发布时间】:2013-06-22 15:34:32
【问题描述】:

单击 Next 按钮时,我试图在 UItableview 中从一个 Uitextfield 跳转到另一个,它向我抛出 Collection <__nsarraym:> 在枚举时发生突变的错误消息。而上一个按钮工作正常。

当我是 tableview 的倒数第二个单元格并想要移动最后一个单元格时会发生这种情况。 下面是一些代码sn-p:

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


    }];

}

【问题讨论】:

  • 代码格式化?如果你解决它,人们会更倾向于阅读你的问题。

标签: ios objective-c uitextfield


【解决方案1】:

通过将 becomeFirstResponder 消息发送到表格视图中的文本字段,您可以使其滚动。通过滚动 visibleCells 数组会发生变化。并且由于在您枚举此数组时发生这种情况,您会得到异常。

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

【讨论】:

    【解决方案2】:

    一个长镜头,但可能是因为键盘被隐藏/显示或另一个 UI 约束,我想这取决于单元格的数量(尝试使用 100 个单元格可能会使其在适合屏幕的最后一个单元格处崩溃而不滚动) 和表格视图大小,当您调用辞职/成为第一响应者时,可见单元格的数量会发生变化(也就是表格视图显示不同的单元格)。尝试先复制数组:

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

    【讨论】:

    • 非常感谢@Valentin .. 更改代码后。它有效..再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2012-07-30
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多