views:

44

answers:

1

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

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

      CFRelease(person);
 }
A: 

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.

Wolfgang Schreurs