2016-06-22 21 views
0

私は自分のテーブルビューのセルの1つにuiviewを持っています。私はこれを参照しているかどうか知りたいのですが(これは100%動作します)正しいです。そうでない場合は、それを行う適切な方法を教えてください。内部のUIViewの参照方法UITableViewCell

基本的には、uviewをcellForRowAtIndexPathのインスタンス変数に割り当てています。このような

何か:その後

myViewReference = cell.myView; 

、私のIVARのプロパティを変更するだけでなく、細胞内のUIViewのプロパティを変更し、それが完璧に動作します。

これは良い方法ですか?

答えて

0

それはどのようにあなたのUITableViewは、それがダイナミックプロトタイプである場合、あなたがスクロールするようUITableViewCell sが再利用可能なよう強く それを参照することをお勧めではありません

  • に設定されている。依存しますこのためのより良い方法は、myViewReferenceを取得するためにviewWithTagメソッドを使用することです。たとえば、

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
    UIView *myViewReference = [cell viewWithTag:1000]; 
    // If you don't use storyboard and init myViewReference programmatically then do this: 
    if (!myViewReference) { 
     myViewReference = [[UIView alloc] initWithFrame:cell.contentView.bounds]; 
     myViewReference.tag = 1000; 
     [cell.contentView addSubview:myViewReference]; 
    } 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    // Get your UITableViewCell by identifying its indexPath. 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIView *myViewReference = [cell viewWithTag:1000]; 
    [myViewReference doSomething]; 

} 
  • それは静的な細胞であれば、それから強い参照を持っているために、完全に罰金です。 myViewReferenceIBOutletをドラッグアンドドロップして、電話で取得することができます。self.myViewReference
+0

お返事ありがとうございます。 viewWithTagでビューを参照する方が良い理由は何ですか? –

+0

そのため、強い参照を保持する必要はありません。それをインスタンス変数に代入すると、強力な参照が保持され、それ以外の場合はARCのもとでもメモリリークが発生します。また、100行、したがって100セルがある場合は、インスタンス変数を100個作成することはありません。 –

+0

明確な答えをありがとう! :) –

関連する問題