2

テーブルビューセルに固有のバックグラウンドで一部のデータを処理する場合、テーブルビューセルのビューを半透明モードにして、テーブルビューセルの上に進行状況インジケータービューを配置したいと思います。

次のコードを試しましたが、アクティビティインジケーターが表示されません。

-(void)showActivityIndicatorInTableView:(UITableView*)tableView 
atIndexPath:(NSIndexPath*)indexPath
{
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
  UIView *view = [[UIView alloc] initWithFrame:cell.contentView.frame];
  view.tag = 50;

  UIActivityIndicatorView *ac = [[UIActivityIndicatorView alloc]
     initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  CGRect frame = view.frame;
  ac.center = CGPointMake(frame.size.width/2, frame.size.height/2);
  [view addSubview:ac];
  [ac startAnimating];
}

私のコードの何が問題になっていますか?これを実装するためのより良い方法は何でしょうか?テーブルビューセルに重なる半透明のビューでインジケータービューを表示するにはどうすればよいですか?

ありがとうございました!

4

2 に答える 2

3

一般的に、外部からUITableViewCell所有しているオブジェクトをいじるのは良い考えではありません。UITableView取得しようとしているセルは、画面からスクロールした後にリサイクルされる可能性があるため、アクティビティインジケーターを追加しても、削除される可能性があります。

より良いアプローチはcellForRowAtIndexPath:、アクティビティインジケーターの追加と削除を処理できるようにすることです。そのため、モデルは、アクティビティインジケーターを表示するインデックスパスのレジストリを保持する必要があります(複数のセルでアクティビティインジケーターを同時にオンにしない場合、「レジストリ」は単一の変数のように単純になる可能性があります) 。はそのcellForRowAtIndexPathレジストリを読み取り、それに応じてセルを装飾する必要があります。アクティビティインジケータを追加する場合は、対応するインデックスパスをレジストリに追加reloadRowsAtIndexPaths:withRowAnimation:し、テーブルビューを呼び出します。アクティビティインジケータをオフにする必要がある場合は、セルのインデックスパスをレジストリから削除し、行を再度リロードします。

基本的に、モデルは状態のキーパーである必要があります。UIViewサブクラスの変更に関係するすべては、で発生する必要がありますtableView:cellForRowAtIndexPath:。最後に、状態を変更する必要がある場合、コントローラーはテーブルビューに「肩を軽くたたく」ようにする必要があります。

于 2013-01-31T15:08:36.317 に答える
2

見た目からすると、作成したUIViewをセルに追加することはありません。次のことを行うことをお勧めします。

[cell.contentView addSubview:view];

また、セルに追加するビューのフレームを実際のセルとは異なるものに変更することもできます。UITableViewこれにより、設定したワーカービューを邪魔することなく、内部をスクロールできます。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.contentView.frame.size.width, cell.contentView.frame.size.height)];

ビューを半透明にするには:

[view setOpaque:YES];
[view setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:0.5]];
于 2013-01-31T15:01:45.377 に答える