2012-02-23 83 views
0

我有一個小應用程序列出了一堆數據庫中的項目。如果您點擊其中一個項目,應用程序將切換到一個新視圖,該視圖將顯示該特定項目上的所有信息。由於顯示的信息量是動態的,因此我通過將第二個視圖設置爲UITableView並根據需要爲所顯示的特定對象設置每行的大小來實現此目的。這通常工作正常,但其中一個項目顯示最後一個項目的文字牆。當我嘗試查看關於這個特定對象的信息時,它不會顯示任何文字牆應該顯示的地方。UITableViewCell不顯示文本

在進行導出時,我可以告訴正在使用的文本來確定單元格和標籤所需的大小是否正確。它看起來像是正確地確定了一個尺寸(它給我的單元格高度是21298,標籤的高度是21294),我可以向下滾動到看起來是一個相當大的空標籤。但是,顯示器有點混亂,就好像屏幕刷新一樣。視圖頂部的文本從開始一直到屏幕頂部的地方停頓,而右側的滾動條也不會正確重新繪製。

之前有人看過類似的東西嗎?

對不起,因爲我沒有足夠的代表

編輯就不能發佈我有截圖:想通了一個答案。一旦最短時間過去,我會將它作爲答案發布。

我想出了一個解決方法,如果有其他人遇到這個問題。

經過一番挖掘,我發現當源字符串長度達到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 2012-02-23 20:24:38