web-dev-qa-db-ja.com

UITableViewCellを読み込むときにUIActivityIndi​​catorViewを設定する方法

2つのUITableViewControllers、AとBがあります。テーブルAの1つのセルをタップすると、UINavigationControllerを使用してTable View Controller Bをプッシュします。しかし、Bのデータはインターネットからダウンロードされます。数秒かかります。 BをロードするときにUIActivityIndicatorViewを追加したいのですが、どうすればこれを実現できますか?

36
Wu Linsen

セルのaccessoryViewとしてIActivityIndi​​catorViewを追加できます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.frame = CGRectMake(0, 0, 24, 24);
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryView = spinner;
    [spinner startAnimating];
    [spinner release];
}
52
EmptyStack

Tableview BクラスのviewDidLoadで、アクティビティインジケーターを追加します。

_// Create the Activity Indicator.
    let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
    activityIndicator.hidesWhenStopped = true
    view.addSubview(activityIndicator)

    // Position it at the center of the ViewController.
    activityIndicator.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor)])
    activityIndicator.startAnimating()
_

次に、ネットワークからデータをダウンロードするメソッドを呼び出します。

_myDownloadMethod()
_

プロセス中にUIが応答しないようにしたくない場合は、別のスレッドで実行します。

このスレッドを読んでください。 バックグラウンドスレッドを使用してデータを解析できますか?

コンテンツがダウンロードされたことが通知されたら、インジケータを停止します。

_activityIndicator.stopAnimating()
_

これで、テーブルをリロードして新しいコンテンツを表示するためにtableview.reloadData()を呼び出すことができます。

30
ArunGJ
UIActivityIndicatorView * activityindicator1 = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(150, 200, 30, 30)];
[activityindicator1 setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityindicator1 setColor:[UIColor orangeColor]];
[self.view addSubview:activityindicator1];
[activityindicator1 startAnimating];

[self performSelector:@selector(callfunction) withObject:activityindicator1 afterDelay:1.0];

-(void)callfunction
{
// Here your stuf
}
8
chandrika

それは私のためにうまくいきます、あなたはそれを試すことができます:
[activityIndi​​cator startAnimating] when didHighlightRowAtIndexPath、[activityIndi​​cator stopAnimating] when didUnhighlightRowAtIndexPath didSelectRowAtIndexPathよりも便利です。

- (void)runIndicatorAtIndexPath:(NSIndexPath *)indexPath display:(BOOL)playing{ 
    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryView = activityIndicator;
    playing == YES ?[activityIndicator startAnimating]:[activityIndicator stopAnimating];
}
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    [self runIndicatorAtIndexPath:indexPath display:YES];
}
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath{
    [self runIndicatorAtIndexPath:indexPath display:NO];
}
4
Cao Yong

次のコードは、サーバーでさらにデータが利用可能な場合、テーブルビューのフッターにスピナーを表示します。サーバーからデータを取得するロジックに従って変更できます。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* set cell attributes here */
    NSInteger lastSectionIndex = [tableView numberOfSections] - 1;
    NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1;
    if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) {
           if(isMoreDataAvailableOnserver)
           {
            [self showSpinnerAtFooter];
            [self getMoreDataFromServer];
           }
           else
           {
            [self hideSpinnerAtFooter];
           }
    }
    return cell;
}
-(void) hideSpinnerAtFooter {
    self.tableView.tableFooterView =nil;
}
-(void) showSpinnerAtFooter {
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [spinner startAnimating];
    spinner.frame = CGRectMake(0, 0, 320, 44);
    self.tableView.tableFooterView = spinner;
}
3
aqsa arshad