我的情况如下:
我们正在创建一个应用程序(其中包括)显示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 :(得分:0)
我找到了解决这个问题的方法。显然,在视图控制器中创建person(ABRecordRef)对象并不是一个好方法。而是在加载ABUnknownViewController之前创建人员。在加载ABUnknownViewController之前还要调用[setDisplayedPerson:]。这样行和部分就可以正确初始化,不再有任何不一致的例外。