2010-08-10 111 views
0

我的情況是這樣的:通訊錄API困境 - NSInternalInconsistencyException

我們正在創建一個應用程序,(除其他事項外)表示從Exchange中的公共文件夾數據。我們希望我們的iPhone應用程序顯示類似iPhone默認的聯繫人(如Apple的AddressBook應用程序),因此我們正在使用AddressBook API。但是,我們不打算在iPhone上保存任何顯示的聯繫人,它只會用於在Exchange公共文件夾中顯示聯繫人。

當我們要顯示聯繫人記錄時,我們使用'pushViewController'方法顯示'ABUnknownPersonViewController'。在代碼中,我們使用ABPersonCreate()方法創建ABRecordRef對象。部分工作正常,我看到名稱和其他細節顯示在標題(圖片佔位符旁邊)。但是,一旦我添加了任何要在UITableViewCell佈局中顯示的細節(如電話,地址等),它就不會顯示出來。更糟糕的是,第二次加載ABPersonViewController並調用「setDisplayedPerson:」方法後,應用程序崩潰。注意:第一次加載的很好,但不會顯示應該在UITableViewCells中顯示的數據。

我收到以下錯誤信息:

2010-08-10 16:23:21.624 SharepointApp[5058:207] *** Assertion failure in -[ABPersonTableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1261.5/UITableView.m:904 

2010-08-10 16:23:21.627 SharepointApp[5058:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Invalid update: invalid number of sections. The number of sections contained in the table view after the update (1) must be equal to the 
number of sections contained in the table view before the update (0), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).' 

*** Call stack at first throw: 
(
0 CoreFoundation 0x02b05919 __exceptionPreprocess + 185 
1 libobjc.A.dylib 0x02c535de objc_exception_throw + 47 
2 CoreFoundation 0x02abe078 +[NSException raise:format:arguments:] + 136 
3 Foundation  0x0019a8cf -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 
4 UIKit    0x0041863e -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] + 7808 
5 UIKit    0x004086d1 -[UITableView endUpdates] + 42 
6 AddressBookUI  0x025a2016 -[ABPersonTableViewDataSource setCurrentTableHeaderView:] + 49 
7 AddressBookUI  0x025a194d -[ABPersonTableViewDataSource updateTableHeaderView] + 928 
8 AddressBookUI  0x025a2276 -[ABPersonTableViewDataSource setPersonModelController:] + 441 
9 AddressBookUI  0x025ef9f0 -[ABPersonViewControllerHelper setDisplayedPeople:] + 307 
10 AddressBookUI  0x025efbe5 -[ABPersonViewControllerHelper _updateDisplayedPeople] + 198 
11 SharepointApp  0x0006866f -[WSPublicContactDetailViewController retrievePersonDataCompleted:] + 654 
12 Foundation  0x0011ee9a __NSThreadPerformPerform + 251 
13 CoreFoundation 0x02ae6d7f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
14 CoreFoundation 0x02a452cb __CFRunLoopDoSources0 + 571 
15 CoreFoundation 0x02a447c6 __CFRunLoopRun + 470 
16 CoreFoundation 0x02a44280 CFRunLoopRunSpecific + 208 
    17 CoreFoundation 0x02a441a1 CFRunLoopRunInMode + 97 
18 GraphicsServices 0x0307b2c8 GSEventRunModal + 217 
19 GraphicsServices 0x0307b38d GSEventRun + 115 
20 UIKit    0x003adb58 UIApplicationMain + 1160 
21 SharepointApp  0x00002878 main + 102 
22 SharepointApp  0x000027e6 start + 54 
23 ???    0x00000001 0x0 + 1 
) 
terminate called after throwing an instance of 'NSException' 

這裏是我的代碼部分:

ABRecordRef person = ABPersonCreate(); 

if (person) { 
     ABRecordSetValue(person, kABPersonLastNameProperty, @"Schreurs", NULL); 
     ABRecordSetValue(person, kABPersonFirstNameProperty, @"Wolfgang", NULL); 
     ABRecordSetValue(person, kABPersonOrganizationProperty, @"Webstate", NULL);   
     ABMultiValueRef phone = ABMultiValueCreateMutable(kABStringPropertyType); 

     if (phone) { 
      ABMultiValueAddValueAndLabel(phone, @"06 123 432 23", kABPersonPhoneMobileLabel, NULL); 
      ABRecordSetValue(person, kABPersonPhoneProperty, phone, NULL);    
      CFRelease(phone); 
     } 

     [self setUnknownPersonViewDelegate:self]; 
     [self setDisplayedPerson:person];  

     CFRelease(person); 
} 

回答

0

我找到了解決這個問題。顯然,在視圖控制器中創建person(ABRecordRef)對象並不是一個好方法。請在加載ABUnknownViewController之前創建該人員。在加載ABUnknownViewController之前調用[setDisplayedPerson:]。通過這種方式,行和部分得到正確的初始化,不會再有任何不一致的異常。