2

UITableView の特定のセルにアクティビティ インジケーターを追加しようとしています。メソッド didSelectRowAtIndexpath を使用してこれを正常に実行します

    CGRect CellFrame = CGRectMake(260, 10, 20, 20);
    actindicator = [[UIActivityIndicatorView alloc]initWithFrame:CellFrame];
    [actindicator setHidesWhenStopped:NO];
    [actindicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];
    actindicator.tag =1;
    [[cell contentView] addSubview:actindicator];

問題は、別の方法からこれらの複数のアクティビティ インジケーターを制御する必要があることです。プロパティはこれを行う方法であると考えましたが、毎回 actIndicator の新しいインスタンスを初期化することで、アクティビティ インジケーターの「最新の」init 以外のすべてへの参照が失われるため、制御できるのは 1 つだけです。

すべての actIndicators への参照を維持して、すべてのアニメーション化を開始できるようにするには、ここで何をする必要がありますか (可能であれば?)。または、何らかの方法で actindicator.tag を使用して、何らかの形式の参照を制御できますか。

助けてくれてありがとう。

編集: (回答から派生) tableView で 1 のタグを持つアクティビティ インジケーターのすべてのインスタンス (可視セルのみ) にアクセスするには、別のメソッドから以下を使用できます。

for (UITableViewCell *cell in [self.tableView visibleCells]) {
    UIActivityIndicatorView *actView = (UIActivityIndicatorView *)[cell.contentView
    viewWithTag:1];
    [actView startAnimating];
    activityFlag = 1;

}

上記のメソッドは、表示されているすべてのセルを循環し、アクティビティ インジケーターのアニメーションを開始します。

テーブルビューがスクロールされるケースを処理するために、cellForRowAtIndexPath にある以下のメソッドを使用してインジケーターを再アニメーション化します。cellStateKey は、セルの横にチェックマークがあるかどうかを示します。セルにチェックマークがあり、アクティビティフラグ (非同期 Web サーバー呼び出しが進行中) が設定されている場合..その後、アニメーションを続行したい.(スクロールテーブルビューとして技術的にアニメーションを再開します。やめます)

if ([[rowData objectForKey:cellStateKey] boolValue]) {

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

      if(cell.accessoryType == UITableViewCellAccessoryCheckmark &&activityFlag ==1){

        for (UIView *sub in [[cell contentView] subviews]) {

            if (sub.tag == 1) {

                UIActivityIndicatorView *acView = (UIActivityIndicatorView *)
                [cell.contentView viewWithTag:1];
                [acView startAnimating];


            }

        }

元の質問で述べたように、メソッド didSelectRowAtIndexPath でアクティビティ インジケーターを初期化します (必要に応じてアクティビティ インジケーターも削除します)。

4

4 に答える 4

3

これを行う簡単な方法 (コードのようにインジケーターを追加すると仮定) は、最初に を呼び出して、テーブル内の表示されているセル (または行) のコレクションを取得すること[tableView visibleCells]です。次に、次のようにセルを反復処理します。

for (UITableViewCell *cell in [tableView visibleCells]) {
    for (UIView *sub in [cell subViews]) {
        if (sub.tag == 1) { // "1" is not a good choice for a tag here
            UIActivityIndicatorView *act = (UIActivityIndicatorView *)sub;
            [act startAnimating]; // or whatever the command to start animating is
            break;
        }
    }
}

対処するのはより複雑です。元のコードでは、呼び出されるたびに既存のセルに追加のアクティビティ インジケーターを追加していないことを確認するcellForRowAtIndexPath必要があり、ユーザーが後でテーブルをスクロールして、アクティビティ インジケーターがオンになっていないセルを表示する可能性があります。

于 2013-05-07T14:40:50.690 に答える
1

アクティビティ ビュー インジケーター タグが cell.contentView 内で一意であると仮定すると、次のようなものを試すことができます。

UITableViewCell *cell = [tableview cellForRowAtIndexPath:indexpath];

UIActivityIndicatorView *acView = (UIActivityIndicatorView *)[cell.contentView viewWithTag:1];

//acView will be your activitivyIndicator
于 2013-05-08T04:39:42.383 に答える