0

私のアプリでは、を使用して10個のユーザーオブジェクトをバッチで返していNSNotificationCenterます。10個のオブジェクトを取得したら、そのデータをテーブルビューに挿入します。このために私は次のコードを使用しています

- (void)viewDidAppear:(BOOL)animated {

    recordCounter = 0;
    noOfRowsCounter = 0;

    // Some code
}

- (void) gotNotification: (NSNotification *) notification {

    NSMutableArray *tempArray = [[notification userInfo]valueForKey:KEY];

    NSLog(@"recordCounter BEFORE=> %d",recordCounter);
    NSLog(@"noOfRowsCounter BEFORE=> %d",noOfRowsCounter);

    self.insertIndexPaths = [[NSMutableArray alloc] init]; 
    for (User *user in tempArray) 
    {
        [self.contactsArray addObject:user];

        recordCounter++;
    }

    for (noOfRowsCounter = noOfRowsCounter; noOfRowsCounter < recordCounter; noOfRowsCounter++) {

        [self.insertIndexPaths addObject:[NSIndexPath indexPathForRow:recordCounter inSection:0]];

    }

    NSLog(@"recordCounter AFTER=> %d",recordCounter);
    NSLog(@"noOfRowsCounter AFTER=> %d",noOfRowsCounter);
    NSLog(@"self.insertIndexPaths count=> %d",[self.insertIndexPaths count]);
    [contactsTableView beginUpdates];
    [contactsTableView insertRowsAtIndexPaths:self.insertIndexPaths 
                             withRowAnimation:UITableViewRowAnimationNone];
    [contactsTableView endUpdates];

    [self.insertIndexPaths removeAllObjects];
}

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

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

    // I am doing this as I have 2 records in single row

    if ([self.insertIndexPaths count]%2 == 0) {

        NSLog(@"In IF::rows:: %d",[self.insertIndexPaths count]/2);
        return [self.insertIndexPaths count]/2;
    }
    else {
        NSLog(@"In ELSE::rows:: %d",[self.insertIndexPaths count]/2+1);
        return [self.insertIndexPaths count]/2 + 1;
    }
}

アプリを実行すると、次のエラーが発生し、アプリがクラッシュします。これが私のコンソールログです

    2012-04-04 12:15:36.559 AppName[1742:6803] recordCounter BEFORE=> 0
2012-04-04 12:15:36.563 AppName[1742:6803] noOfRowsCounter BEFORE=> 0
2012-04-04 12:15:38.539 AppName[1742:6803] recordCounter AFTER=> 10
2012-04-04 12:15:38.543 AppName[1742:6803] noOfRowsCounter AFTER=> 10
2012-04-04 12:15:38.546 AppName[1742:6803] self.insertIndexPaths count=> 10

2012-04-04 12:15:42.971 AppName[1742:6803] In IF::rows:: 5

2012-04-04 12:15:44.292 AppName[1742:6803] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-1448.89/UITableView.m:995
2012-04-04 12:15:44.306 AppName[1742:6803] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (10 inserted, 0 deleted).'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x36c4164f __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x332fec5d objc_exception_throw + 24
    2   CoreFoundation                      0x36c41491 +[NSException raise:format:arguments:] + 68
    3   Foundation                          0x334ec573 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62
    4   UIKit                               0x30ca4379 -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 4500
    5   UIKit                               0x30cae2f9 -[UITableView endUpdatesWithContext:] + 28
    6   UIKit                               0x30cae2d5 -[UITableView endUpdates] + 16
    7   AppName                       0x00004927 -[AppNameViewController batchNotification:] + 770
    8   Foundation                          0x334a4183 _nsnote_callback + 142
    9   CoreFoundation                      0x36c1020f __CFXNotificationPost_old + 402
    10  CoreFoundation                      0x36baaeeb _CFXNotificationPostNotification + 118
    11  Foundation                          0x334a15d3 -[NSNotificationCenter postNotificationName:object:userInfo:] + 70
    12  AppName                       0x00007705 -[AddressBook getAddressBookData] + 1700
    13  AppName                       0x0000447b -[AppNameViewController retriveAddressBookData] + 102
    14  Foundation                          0x334b3389 -[NSThread main] + 44
    15  Foundation                          0x335255cd __NSThread__main__ + 972
    16  libsystem_c.dylib                   0x350c0311 _pthread_start + 248
    17  libsystem_c.dylib                   0x350c1bbc start_wqthread + 0
)
terminate called after throwing an instance of 'NSException'

それらのレコードをテーブルビューに追加したいと思います。これどうやってするの。ありがとう

更新:cellForRowAtIndexPathのコード

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

    ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        NSArray *cellArray=[[NSBundle mainBundle] loadNibNamed:@"ContactCell" owner:self options:nil];
        //NSLog(@"cellArray count => %d",[cellArray count]);
        cell=[cellArray objectAtIndex:0];
    }

    // Configure the cell...

    // For showing 2 records in single row

    int row = indexPath.row * 2;
    if (row <= [self.contactsArray count]) 
    {
        User *user = [self.contactsArray objectAtIndex:row];
        NSLog(@"In ROW: %@",user.firstName);
        cell.firstNameLabel.text=[NSString stringWithFormat:@"%@",nameString];
    }

    if ((row + 1) < [self.contactsArray count]) 
    {

        User *user = [self.contactsArray objectAtIndex:row+1];
        NSLog(@"In ROW+1: %@",user.firstName);
        cell.secondNameLabel.text=[NSString stringWithFormat:@"%@",nameString];
    }

     return cell;
}
4

2 に答える 2

1

データによると、セクションの行数で5を返していますが、self.insertIndexPathsには10個のインデックスパスがあります

[contactsTableView insertRowsAtIndexPaths:self.insertIndexPaths 
                         withRowAnimation:UITableViewRowAnimationNone];

これらの行は、10行を挿入するように指定しています。これは、更新後に取得する行数のエラーで明確に示されているように、セクションの行数で返される値と同じである必要があります。

行を置き換えます

 for (noOfRowsCounter = noOfRowsCounter; noOfRowsCounter < recordCounter; noOfRowsCounter++) {

        [self.insertIndexPaths addObject:[NSIndexPath indexPathForRow:recordCounter inSection:0]];

    }

    int presentrows = [yourtablename numberOfRowsInSection:0];
    int Finalnumberofrows;
    if ([self.insertIndexPaths count]%2 == 0) {
    Finalnumberofrows = [self.contactsArray count]/2;
}
else {
    Finalnumberofrows = [self.contactsArray count]/2 + 1;
}
    for (presentrows; presentrows < Finalnumberofrows; presentrows++) {

    [self.insertIndexPaths addObject:[NSIndexPath indexPathForRow:presentrows inSection:0]];

}

インデックスメソッドで行のテーブルビューセルを置き換えます-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

// I am doing this as I have 2 records in single row

if ([self.contactsArray count]%2 == 0) {

    NSLog(@"In IF::rows:: %d",[self.insertIndexPaths count]/2);
    return [self.contactsArray count]/2;
}
else {
    NSLog(@"In ELSE::rows:: %d",[self.insertIndexPaths count]/2+1);
    return [self.contactsArray count]/2 + 1;
}

}

于 2012-04-04T07:34:48.807 に答える
0

キャッチされなかった例外が原因でアプリを終了した後、実際のエラーが表示されます。
セクション0の行数が無効です。更新後の既存のセクションに含まれる行数(5)は、更新前のそのセクションに含まれる行数(0)に、プラスまたはマイナスの数と等しくなければなりません。そのセクションから挿入または削除された行の数(10が挿入され、0が削除されました)

だから問題は何ですか?0行あり、次に10行挿入し、5行あると言いますか?意味がありません。実装を確認する必要があります-tableView:numberOfRowsInSection:

1行に2つのレコードを表示したいだけです。それは本当に意味がありません。そのため、テーブルビューのアニメーションは不必要に複雑になります。
ただし、それを維持したい場合は、10行ではなく5行を挿入したことをテーブルに伝えない場合があります。

于 2012-04-04T07:34:18.877 に答える