2012-02-23 29 views
0

データベースに多数の項目をリストする小さなアプリケーションがあります。アイテムの1つをクリックすると、その特定のアイテムに関するすべての情報を表示する新しいビューに切り替わります。表示される情報の量は動的なので、2番目のビューをUITableViewにして、表示されている特定のオブジェクトに必要に応じて各行のサイズを設定します。これは正常に動作しますが、アイテムの1つには最後に表示されたアイテムの壁が表示されます。この特定のオブジェクトに関する情報を表示しようとすると、テキストの壁が表示される場所は表示されません。UITableViewCellにテキストが表示されない

ダビング中に、セルとラベルのサイズを判断するために使用されているテキストを正確に伝えることができます。それはサイズを正しく決定しているように思えます(セルに21298、ラベルに21294という高さを与えます)、かなり大きな空ラベルと思われるものにスクロールダウンできます。しかし、画面がちょっと爽やかであるように、ディスプレイはちょっと混乱します。ビューの上部にあるテキストは、画面の始めから画面の上端までスタートし、右側のスクロールバーは正しく再ペイントされません。

これまでにみた人は誰ですか?答えを考え出した:私は十分に担当者

EDITを持っていないので、

申し訳ありませんが、私が持っているスクリーンショットを投稿することはできません。私は最小限の時間が過ぎると回答として投稿します。

誰かがこの問題に遭遇した場合、私は回避策を考え出しました。

ある程度掘り下げた後、ソース文字列の長さが約41,000になると、この描画エラーの原因となることがわかりました。だから私は約30,000以上の任意の文字列を分割し、テーブルに複数の行を追加しました。これで、テキスト全体が表示されます。

コード:

#define FONT_SIZE 14.0f 
#define CELL_CONTENT_WIDTH 320.0f 
#define CELL_CONTENT_MARGIN 2.0f 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    //static NSString *CellIdentifier = @"Cell"; 
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", [indexPath row]]; 
UILabel *label = nil; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

    label = [[UILabel alloc] initWithFrame:CGRectZero]; 
    [label setLineBreakMode:UILineBreakModeWordWrap]; 
    [label setMinimumFontSize:10.0]; 
    [label setNumberOfLines:0]; 
    [label setFont:[UIFont systemFontOfSize:FONT_SIZE]]; 
    [label setTag:1]; 

    if ([indexPath row] == 1 || [indexPath row] == 2) 
    { 
     [label setTextColor:[UIColor redColor]]; 
    } 
    else if ([indexPath row] == 3) 
    { 
     [label setTextColor:[UIColor colorWithRed:0.0f green:150.f/255.f blue:30.f/255.f alpha:1.0f]]; 
    } 
    else if ([indexPath row] == 5) 
    { 
     [label setTextColor:[UIColor colorWithRed:155.f/255.f green:145.f/255.f blue:0.0f alpha:1.0f]]; 
    } 

    [[cell contentView] addSubview:label]; 
} 

NSString *text = [cardInfo objectAtIndex:[indexPath row]]; 

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f); 
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 

if (!label) 
{ 
    label = (UILabel *)[cell.contentView viewWithTag:1]; 
} 

[label setText:text]; 
[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), MAX(size.height, 30.0f))]; 

// Configure the cell... 

return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSString *text = [cardInfo objectAtIndex:[indexPath row]]; 
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN *2), 20000000000000.0f); 
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
CGFloat height = MAX(size.height, 30.0f); 
return height + (CELL_CONTENT_MARGIN * 2); 
} 

答えて

0

誰かがこの問題に遭遇した場合、私は回避策を考え出しました。

ある程度掘り下げた後、ソース文字列の長さが約41,000になると、この描画エラーの原因となることがわかりました。だから私は約30,000以上の任意の文字列を分割し、テーブルに複数の行を追加しました。これで、テキスト全体が表示されます。

2

これはエラーです:

[label setTag:[indexPath row]]; 

あなたはセルのビュー階層を構築しているとき、あなたは行番号を参照することはありません。どうして?セルは別の行に再利用できるためです!それはdequeueReusableCellWithIdentifier:のすべてです。

代わりに、あなたのラベルのタグのための定数を定義します。

static const int LabelTag = 100; 

使用タグ設定して一定のこと:

label.tag = LabelTag; 

以降、あなたがそのテキストを設定するラベルを取得する必要があり、再度定数を使用してください:

label = (UILabel *)[cell.contentView viewWithTag:LabelTag]; 
+0

これは良いことです。これは私がやっていた別のバグを修正しました。ありがとう – rwakelan

関連する問題