Проблемы API AddressBook - NSInternalInconsistencyException

Моя ситуация следующая:

Мы создаем приложение, которое (среди прочего) показывает данные из общих папок в Exchange. Мы хотели бы, чтобы наше приложение для iPhone отображало контакты так же, как iPhone делает это по умолчанию (например, приложение Apple AddressBook), поэтому мы используем API AddressBook. Однако мы не собираемся сохранять какие-либо отображаемые контакты на самом iPhone, он будет использоваться только для отображения контактов в общих папках Exchange.

Когда мы собираемся показать запись контакта, мы используем метод pushViewController для отображения ABUnknownPersonViewController. В коде мы создаем объекты ABRecordRef, используя метод ABPersonCreate(). Часть работает нормально, я вижу название и другие детали, которые показаны в шапке (рядом с заполнителем изображения). Однако, как только я добавляю какие-либо детали, которые должны отображаться в макете 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);
 }

person Wolfgang Schreurs    schedule 10.08.2010    source источник


Ответы (1)


Я нашел решение этой проблемы. По-видимому, это не очень хороший подход к созданию объекта человека (ABRecordRef) внутри контроллера представления. Вместо этого создайте человека перед загрузкой ABUnknownViewController. Также вызовите [setDisplayedPerson:] перед загрузкой ABUnknownViewController. Таким образом, строки и разделы будут правильно инициализированы, больше не будет исключений несоответствия.

person Wolfgang Schreurs    schedule 11.08.2010