我有一个UITableView
,可以从名为 friendsList 的NSMutableArray
中读取项目。
我在这里初始化这个数组:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
self.title = TA(@"Find Friends", @"");
self.navigationItem.rightBarButtonItem = [self createRightNavBarButton];
self.navigationItem.leftBarButtonItem = [self createLeftNavBarButton];
friendsList = [[NSMutableArray alloc]init];
}
return self;
}
如果计数大于零
,我已为datasource
设置numberOfRows
方法返回friendslist.count
。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (friendsList.count) {
return friendsList.count;
}
else{
return 0;
}
}
在我用另一种方法填充数组后,我调用[tableView reloadData]
,以便再次调用datasource
方法来读取数组中对象的计数。
- (void)loadContactsFromSource:(ListSource)source
{
if (friendsList) {
[friendsList removeAllObjects];
}
switch (source) {
case LS_Facebook:
break;
case LS_Twitter:
break;
case LS_Contacts:{
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(nil, nil);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(
kCFAllocatorDefault,
CFArrayGetCount(allPeople),
allPeople
);
CFArraySortValues(
peopleMutable,
CFRangeMake(0, CFArrayGetCount(peopleMutable)),
(CFComparatorFunction) ABPersonComparePeopleByName,
(void*) ABPersonGetSortOrdering()
);
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
for ( int i = 0; i < nPeople; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex(peopleMutable, i);
[self copyContactToArray:ref];
}
[tableFriends reloadData];
}
else{
[PopupHandler popupDialogWithTitle:T(@"Error", @"")
message:T(@"Access denied", @"")
delegate:nil];
}
});
break;
}
default:
break;
}
}
这是cellForRow方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
NSDictionary *currentPerson = [friendsList objectAtIndex:indexPath.row];
cell = [self fillCell:cell withUserInfo:currentPerson];
return cell;
}
问题是在此表保持空白后,数组中的项目不会显示。如果我用手指触摸桌子,项目会立即显示,好像触摸会以某种方式刷新桌面。可能导致这种情况的任何想法?
我在使用XCode 5.0.1构建的iOS 7 iPhone 5上进行测试。
答案 0 :(得分:0)
看起来ABAddressBookRequestAccessWithCompletion
在一个单独的线程上被调用,并且它在完成时运行的块不在主线程中。因此更新块内的UI将无法正常工作。尝试创建一个函数,并从地址簿返回中的主线程上调用该函数,或者在地址簿返回块中执行dispatch_async。
通过使用ABAddressBookRequestAccessWithCompletion
或dispatch_async
将performSelectorOnMainThread
发送到主线索的返回区内。