0

イベント tableView:didSelectRowAtIndexPath でタップされたセルの下に新しいセルを追加しようとしています

これらは私の numberOfSectionsInTableView と numberOfRowsInSection メソッドです。プロパティ self.dataTable は、TableView のデータソースです。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //i have that - 1 there because i don't want to use the first row of my dataTable.
    //On my cellForRowAtIndex method I'm adding a +1 to the indexPath.row to get the right row information
    return [self.dataTable count] - 1;
}

私の追加方法は次のとおりです。

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSMutableArray * newRow = [NSMutableArray arrayWithObjects:@"Columna 1", @"Columna 2", @"Columna 3", @"Columna 4", nil];
    //here im adding the new item to the datasource.
    [self.dataTable insertObject:newRow atIndex:indexPath.row + 1];                       

    NSArray *newData = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:(indexPath.row + 1) inSection:1], nil];
    //self because this clas inherits from UITableView and implements its own delegate and datasource.
    //The error is also produced using tableView instead of self.
    [self beginUpdates];

    [self insertRowsAtIndexPaths:newData withRowAnimation:UITableViewRowAnimationBottom];

    [self endUpdates];

}

デバッガーが [self endUpdates] に到達すると、メソッド numberOfRowsInSection が起動され、リターンが +1 で更新されていることがわかりますが、次のエラーが発生します。

例外名: NSInternalInconsistencyException 理由: テーブル ビューの更新が無効です。アプリケーションは、データ ソースによって提供された状態と矛盾するテーブル ビューへの更新を要求しました。

編集: cellForRowAtIndexPath の追加

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * CellIdentifier = @"SWTableCell";

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    UILabel *lblTemp; //Used for creates labels for cell
    CGRect readjust, rectTemp;
    rectTemp = CGRectMake(0, 0, self.frame.size.width, 15); //Size of the cell


    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.frame = rectTemp;

    int x = 10; //initial x position for each label
    for(int i = 0; i < self.columnCount; i++)
    {
        rectTemp = CGRectMake(x, 10, COLUMN_WIDTH, 20); //Size of each column

        lblTemp = [[UILabel alloc] initWithFrame:rectTemp]; //inicialize label
        lblTemp.tag = i;
        [lblTemp setUserInteractionEnabled:NO];
        lblTemp.text = (NSString *)[[dataTable objectAtIndex:indexPath.row + 1] objectAtIndex:i];
        lblTemp.autoresizingMask= UIViewAutoresizingFlexibleRightMargin;
        [lblTemp setHighlightedTextColor:[UIColor whiteColor]];
        if(i!=0) lblTemp.textAlignment = UITextAlignmentRight;
        else lblTemp.textAlignment = UITextAlignmentLeft;

            lblTemp.font = [UIFont systemFontOfSize:10];
            [cell setUserInteractionEnabled:YES];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        [lblTemp setNumberOfLines:1];
        [lblTemp sizeToFit];

        readjust = lblTemp.frame;
        readjust = CGRectMake(readjust.origin.x, readjust.origin.y, COLUMN_WIDTH, readjust.size.height);
        lblTemp.frame = readjust;


        [cell.contentView addSubview:lblTemp];
        [lblTemp release];

        x = x + COLUMN_WIDTH;
    }
    }
    return cell;
}

他に何がこの問題を引き起こしている可能性がありますか?

4

1 に答える 1

0

おもう

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.dataTable count] - 1;
}

する必要があります

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.dataTable count];
}

コレクションの見つかった長さは、含まれているアイテムの数です。インデックスのみが 0 から始まります。したがって、配列に 5 つの項目を入れた場合、カウントは 5 ですが、最後の項目のインデックスは 4 です。

今、私も盲目です:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //…
    [self beginUpdates];
    [self insertRowsAtIndexPaths:newData withRowAnimation:UITableViewRowAnimationBottom];
    [self endUpdates];
}

でなければなりません

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //…
    [tableView beginUpdates];
    [tableView insertRowsAtIndexPaths:newData withRowAnimation:UITableViewRowAnimationBottom];
    [tableView endUpdates];
}
于 2012-04-19T18:38:23.970 に答える