UITableView项目未显示

时间:2013-11-11 16:18:37

标签: ios objective-c arrays uitableview

我有一个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上进行测试。

1 个答案:

答案 0 :(得分:0)

看起来ABAddressBookRequestAccessWithCompletion在一个单独的线程上被调用,并且它在完成时运行的块不在主线程中。因此更新块内的UI将无法正常工作。尝试创建一个函数,并从地址簿返回中的主线程上调用该函数,或者在地址簿返回块中执行dispatch_async。

通过使用ABAddressBookRequestAccessWithCompletiondispatch_asyncperformSelectorOnMainThread发送到主线索的返回区内。