2010-08-10 4 views
0

Моя ситуация следующая:Addressbook API Беды - NSInternalInconsistencyException

Мы создаем приложение, которое (помимо всего прочего) показывает данные из общих папок в Exchange. Мы хотим, чтобы наше iPhone-приложение отображало контакты, подобные iPhone, по умолчанию (например, приложение AddressBook от Apple), поэтому мы используем 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); 
} 

ответ

0

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