2012-04-04 7 views
0

私のアプリでは、NSNotificationCenterを使用して10個のユーザーオブジェクトをバッチで返しています。 10個のオブジェクトを取得すると、そのデータをテーブルビューに挿入します。私は私のアプリがクラッシュした&次のエラーを取得する私のアプリを実行する場合は、このために私は次のコード'NSInternalInconsistencyException' iuitableview iphoneで行を挿入中

- (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' 

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

はUPDATE: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; 
} 

答えて

1

あなたのデータによるとあなたはセクションの行数に5を返すが、あなたの self.insertIndexPathsされているが、エラーに明確に述べたように、これらの行は、10行を挿入するように指定する10のインデックス・パス

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

を持っています更新後に取得する行数は、section内の行数で返される値と等しくなければなりません。

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

} 

と線

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

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

    } 

を交換し、索引法 で行の テーブルビューセルを置き換える - (NSInteger)のtableView:(のUITableView *)のtableView numberOfRowsInSection:(NSInteger)セクション {

// 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; 
} 

}

+0

forループでエラーが発生しました:: for(presentrows; presentrows iOSAppDev

+0

今はクラッシュしていませんが、その度にself.insertIndexPaths count => 0と表示されます – iOSAppDev

+0

編集された回答を参照 –

0

のコード本当のエラーががキャッチされない例外によるアプリの終了後にリストされています。
セクション0の行数が無効です。更新(5)後の既存のセクションに含まれる行数は、更新前のセクション(0)、プラスまたは(挿入された10個、削除された0個)

問題は何ですか?あなたは0の行を持っていて、10を挿入して、5つの行を持っていると言っていますか?意味がない。 -tableView:numberOfRowsInSection:の実装を確認する必要があります。

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

+0

テーブルに10行5行を挿入したことをどのように伝えることができますか?私はこれを得ていない。ごめんなさい。 – iOSAppDev

+0

'[contactsTableView insertRowsAtIndexPaths:self.insertIndexPaths withRowAnimation:UITableViewRowAnimationNone];'新しいセルをテーブルに挿入します。配列には(あなたの場合の)10個のインデックスパスが含まれているので、5個しか必要ないのに10個のインデックスパスが追加されます。要素ごとに1つのセルを使用してください。それはずっと簡単です。 –

+0

'for(noOfRowsCounter = noOfRowsCounter; noOfRowsCounter iOSAppDev

関連する問題