0

ファイル名を表示するセルで満たされた UITableView があり、セルはファイルのアップロード/ダウンロードの進行状況も示しています。ファイルを移動すると、対応するセルのUIActivityIndicatorViewアクセサリ ビューに が表示されます。UIActivityIndicatorViewセットアップが完了し、準備が整いましたが、viewDidLoad複数のセルのアクセサリ ビューとして設定しようとすると、1 つのセルにしか表示されません。

-(void)viewDidLoad {

    [super viewDidLoad];

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [activityIndicator startAnimating];

}


//...code that detects file changes and calls fileChange


-(void)fileChange {

    for (int i = 0; i < [self.cloudNames count]; i++) {

        //detect whether file name in array is uploading, downloading, or doing nothing

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

        if (downloading) {

            cell.accessoryView = activityIndicator;
            //other changes here specific to downloads

        } else if (uploading) {

            cell.accessoryView = activityIndicator;
            //other changes here specific to uploads

        } else {

            cell.accessoryView = nil;

        }

    }

}

先ほど言ったように、アクティビティ インジケーターは、表示すべきセルが複数ある場合でも、1 つのセルにしか表示されません

このメソッドはアップロード/ダウンロード中に何度も呼び出されるため、(機能していても) メソッドUIActivityIndicatorViewにを設定したくありません。fileChangeメソッドが呼び出され、そこにアクティビティ インジケーターが設定されている場合、メソッドが呼び出されたときにすべてのテーブル ビュー セルでアクティビティ インジケーターがリセットされ、アニメーションがぎこちなく滑らかでなくなり、大量のメモリの問題が発生します。

何をすべきかのアイデアはありますか?ありがとう。

4

1 に答える 1

3

セルのアクティビティインジケータを設定している場合でも、そのセルのインスタンス変数は1つだけです。これを行う方法は、内部の各セルのインジケーターを作成することですtableView:cellForRowAtIndexPath:

のタグを設定できます。タグUIActivityIndicatorViewにアクセスしたり、取得したりするときはいつでも、セルを取得し、を使用してインジケータービューを取得できます[cellView viewWithTag:theTag]。インスタンス変数は必要ありません。

物事をさらに魅力的にしたい場合は、カスタムセル内でサブクラスUITableViewCell化してやりたいことを何でも行うことができます。

編集:

ビューを取得するには、アクセサリビューに割り当てて、セルのaccessoryViewを取得します。

 UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

 UIActivityIndicatorView *indicator = (UIActivityIndicatorView *) cell.accessoryView;

または、UIActivityIndi​​catorViewをセルのcontentViewに追加することもできます(こうすることで、好きな場所に配置できるため、柔軟性が高まります)。

インジケーターの追加:

myIndicatorView.tag = 1;
[cell.contentView addSubview:myIndicatorView];

インジケーターの取得:

UIActivityIndicatorView *indicator = [cell.contentView viewWithTag:1];

お役に立てれば

于 2012-07-07T19:57:29.120 に答える