2011-09-13 7 views
0

カスタムUITableViewCellクラスを作成し、layoutSubviewsメソッドを使用してカスタムラベルを追加しました。このように:カスタムテーブルセルにUILabelサブビューを追加すると、ラベルテキストが画面上で更新されない

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    if (statusLabel == nil) 
    { 
     statusLabel = [[UILabel alloc]initWithFrame:CGRectMake(430.0, 10.0, 100.0, 20.0)]; 
     [statusLabel setTextAlignment:UITextAlignmentRight]; 
     [statusLabel setText:@"Status, set in code"]; 
     statusLabel.tag = 1; 

     [self.contentView addSubview:statusLabel]; 
    }   
} 

ご覧のとおり、ラベルの最初のテキストを「ステータス、コードで設定」に設定しました。私はそうのように、cellForRowAtIndexPathメソッドでは、このカスタムラベルのテキストを設定し、テーブルビューコントローラで

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int index = [indexPath row]; 

    NSString *introducerString =[introducers objectAtIndex:index]; 
     NSArray *parts = [introducerString componentsSeparatedByString:@","]; 

    static NSString *MyIdentifier = @"Requester"; 
    UITableViewCell *cell = [tableView 
          dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[DanceCardCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
             reuseIdentifier:MyIdentifier] autorelease]; 
    } 

    UIImage *image = [UIImage imageNamed:@"1.jpg"]; 
    [cell.imageView setImage:image]; 
    cell.textLabel.text = [parts objectAtIndex:1]; 
    cell.detailTextLabel.text = @"Some text"; 

    UILabel *statusLabel = (UILabel *)[cell viewWithTag:1]; 
    statusLabel.text = @"Did it!"; 

    return cell; 
} 

私は2つのボタンのどちらに応じて、2つのリストを表示するには、1つのテーブルビューを使用していますが押された。ボタンを押すと、適切なテーブルビューコントローラがテーブルビューにアタッチされ、reloadDataメソッドが呼び出されて新しいデータの表示がトリガされます。新しいデータは表示されますが、カスタムラベルのテキストには「Did it!」と表示されます。私はリストを二度切り替えるまで "Status、set in code ..."と読みます。

カスタムラベルの新しいテキストをすぐに更新するにはどうすればよいですか?私は公式のドキュメンテーションをチェックしており、カスタムコンテンツを更新した後にセルの表示をリフレッシュするための参照を見つけることができません。あなたは、細胞を初期化してすぐに内部のタグ1とstatusLabelを見つけようとしているhttp://www.dsbsystems.co.uk/images/xcode1.png

答えて

2

:ここ

は何が起こるかを実証するスクリーンショットです。 layoutSubviewsにはまだ呼び出す機会がなかったため、ラベルは作成されていませんでした。 (テーブルビューのセルで指定された初期化メソッドをオーバーライドしてそこにラベルを作成することをお勧めします)

statusLabelを取り出しようとすると、そのようなビューは存在しないため、nilになります。 method on)nilは単に何もしません(実際にはnilを返します)。たとえば、あなたが爆発的なものに慣れていれば、これが進むのを目の当たりにする必要があります。 null参照例外。

セルが再度要求されると、再利用キューから使用できるため、新しいセルは不要で、ラベルは正しく検出されます。

+0

Jesper、あなたは最高です! –

+0

ありがとうございます。ビューを遅延初期化するという考えは悪くないが、大きなビューに適用すると効果的です。セルが作成されると、ラベルがすぐに必要になることがわかります。 – Jesper

関連する問題