UIActivityIndi​​catorView仅在加载完成后出现

时间:2012-08-24 07:12:06

标签: iphone objective-c ios uitableview uiactivityindicatorview

在我的UITableView中,我使用的是带有书名,书籍状态和续订按钮的自定义单元格。但是,图书状态需要一些加载视图互联网,因此需要时间来加载。

尝试过Asynchronous只加载书籍状态的部分但是太难了。因此,我试图改为使用“加载数据”微调器。已经创建了一个用于微调器的类并在cellForRowAtIndexPath中实现,但是微调器只在最后显示我的UITable已经完成所有加载!我不知道在哪里放置这些代码:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    lVC = [[LoadingViewController alloc] initWithNibName:@"LoadingViewiPad" bundle:nil];
    [self.parentViewController.view addSubview:lVC.view];
} else {
    lVC = [[LoadingViewController alloc] init];
    [self.parentViewController.view addSubview:lVC.view];
}

我已经尝试将其放在viewDidLoad甚至viewWillAppear中,但它似乎无法正常工作。所有事情的结果最终都表明,当所有事情都已经完成加载时,微调器会显示出来。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UserCustomCell *cell = (UserCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"UserCustomCell" owner:self options:nil];
    cell = userCustomCell;
    self.userCustomCell = nil;
}

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    cell.bookTitle.frame = CGRectMake(12, 0, 550, 40);
    cell.renewButton.frame = CGRectMake(600, 14, 68, 24);
}
[cell.renewButton useBlackActionSheetStyle];

cell.bookTitle.text =@"Book Title";

// I place the UIActivityIndicator class here before I do the loading
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    lVC = [[LoadingViewController alloc] initWithNibName:@"LoadingViewiPad" bundle:nil];
    [self.parentViewController.view addSubview:lVC.view];
} else {
    lVC = [[LoadingViewController alloc] init];
    [self.parentViewController.view addSubview:lVC.view];
}
NSString *reservation = [self noOfRenewalLeft:index];   ###### throw into method to do internet connection and checking
                                                                                                //method will then return NSString "reserved" or "notReserved"

if ([reservation isEqualToString: @"notReserved"]){     //if item not reserved

    if([renewalLeftString isEqualToString: @"0"]){              
        cell.bookStatus.text = @"Reached Max Renewal Limit";
    }
    else{                                                   //item not reserved & able to renew, therefore display renewal left
        cell.bookStatus.text = [NSString stringWithFormat:@"Renewal Left: %@",renewalLeftString];
    }
}
else {
    cell.bookStatus.text = @"Item Reserved/On-Hold";
}

cell.renewButton.tag = index_tag;
return cell;

}

4 个答案:

答案 0 :(得分:0)

只需使用默认的Apple ActivityIndi​​cator并将其放入Cell。你不需要一堂课。 然后在加载完成后创建通知,或在加载完成时调用委托方法。然后,此方法删除微调器并将正确的内容放入单元格中。之后刷新已完成加载的单元格。

答案 1 :(得分:0)

事件虽然您没有发布noOfRenewalLeft的详细信息,但我认为它正在主线程中加载并阻止它。因此,在主线程继续之前(完成下载之后)无法呈现您的活动指示器。尝试异步下载和委派。

答案 2 :(得分:0)

创建单独的方法并使用performselectorinbackground调用该方法来加载活动指示器,因为在主线程中加载任何来自Internet的内容,因此一旦下载过程完成,活动指示符就会加载。

答案 3 :(得分:0)

最后我做的是将UIActivityIndi​​cator置于viewDidLoad方法中,并在viewDidAppear中取消它。它现在有效!谢谢大家的帮助:))