开发者

AddressBook API woes - NSInternalInconsistencyException

开发者 https://www.devze.com 2023-01-10 19:16 出处:网络
My situation is the following: We\'re creating an application that (among other things) shows data from the Public Folders in Exchange. We\'d like our iPhone App to display contacts like the iPhone d

My situation is the following:

We're creating an application that (among other things) shows data from the Public Folders in Exchange. We'd like our iPhone App to display contacts like the iPhone does it by default (like Apple's AddressBook app), therefore we're making use of the AddressBook API. However, we don't intend to save any displayed contacts on the iPhone itself, it will just be used to display contacts in the Public Folders of Exchange.

When we're about to show a contact record, we make use of the 'pushViewController' method to display an 'ABUnknownPersonViewController'. In code we're creating ABRecordRef objects using the ABPersonCreate() method. Part of it works fine, I see the name and other details that are show in the header (next to the picture placeholder). However, once I add any details that are to be shown in a UITableViewCell layout (like phone, address, etc...) it doesn't show up. Worse still, the app crashes once I load a ABPersonViewController for the 2nd time and the 'setDisplayedPerson:' method is being called. Note: the first time it loads just fine, but it doesn't show the data that should be displayed in UITableViewCells.

I receive the following error message:

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'

Here's part of my the code:

 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) {
         开发者_StackOverflow社区  ABMultiValueAddValueAndLabel(phone, @"06 123 432 23", kABPersonPhoneMobileLabel, NULL);
           ABRecordSetValue(person, kABPersonPhoneProperty, phone, NULL);               
           CFRelease(phone);
      }

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

      CFRelease(person);
 }


I found the solution to this problem. Apparently it's not a good approach to create the person (ABRecordRef) object inside the view controller. Instead create the person before loading the ABUnknownViewController. Also call [setDisplayedPerson:] before loading the ABUnknownViewController. This way the rows and sections get correctly initialized, there won't be any inconsistency exceptions anymore.

0

精彩评论

暂无评论...
验证码 换一张
取 消