0

UITableViewでは、本のタイトル、本のステータス、更新ボタンのあるカスタムセルを使用しています。ただし、書籍のステータスにはインターネットビューの読み込みが必要なため、読み込みに時間がかかります。

非同期を実行して、ブックステータスのパーツのみをロードしようとしましたが、難しすぎます。そのため、代わりに「データの読み込み」スピナーを実行しようとしていました。スピナーのクラスを作成して実装しまし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

4 に答える 4

0

結局、私がしたことは、代わりにUIActivityIndi​​catorをviewDidLoadメソッドに配置し、viewDidAppearでキャンセルすることでした。今は動作します!皆さんも助けてくれてありがとう:)

于 2012-08-26T17:33:46.853 に答える
0

個々のメソッドを作成し、performselectorinbackgroundを使用してそのメソッドを呼び出し、アクティビティインジケーターを読み込みます。これは、インターネットからメインスレッドの読み込みとして何かを読み込むため、ダウンロードプロセスが完了するとアクティビティインジケーターが読み込まれるためです。

于 2012-08-24T08:50:30.853 に答える
0

デフォルトのAppleActivityIndi​​catorを使用して、セルに配置するだけです。そのためのクラスは必要ありません。次に、ロードが終了したときに通知を作成するか、ロードが終了したときに呼び出されるデリゲートメソッドを作成します。次に、このメソッドはスピナーを削除し、セルに正しいコンテンツを配置します。その後、ロードを終了したセルを更新します。

于 2012-08-24T07:20:34.217 に答える
0

イベントの詳細は投稿していませんnoOfRenewalLeftが、メインスレッドに読み込まれているため、ブロックされていると思います。そのため、メインスレッドが続行する前(ダウンロードの終了後)にアクティビティインジケーターをレンダリングすることはできません。非同期ダウンロードと委任を試してください。

于 2012-08-24T07:45:23.847 に答える