2012-01-25 55 views
0

好吧,我有另一個UITableView問題。出於某種原因,indexPath.row都混亂了。當我註釋掉設置單元格的if語句時,一切正常。 NSLogs告訴我他們是按順序加載的,但是所有的單元格都是亂序的。UITableViewCells壞了

這似乎也似乎他們重複;我只看到8個細胞,他們反覆重複。

這裏是我的代碼:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 
NSLog(@"row: %d",indexPath.row); 

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.backgroundColor = [UIColor clearColor]; 
    cell.contentView.backgroundColor = [UIColor clearColor]; 

    // Add subviews like this: 
    // [[cell contentView] addSubview:objectName]; 
    // And I get the row number like this: indexPath.row when getting objects from the array 

} 

return cell; 
} 

回答

1

要使用代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 
NSLog(@"row: %d",indexPath.row); 

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

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     cell.backgroundColor = [UIColor clearColor]; 
     cell.contentView.backgroundColor = [UIColor clearColor]; 

     // Add subviews like this: 
     // [[cell contentView] addSubview:objectName]; 


    } 
    ### Move this here ### 
// And I get the row number like this: indexPath.row when getting objects from the array 
return cell; 
} 

「我只看到8個單元,他們重複一遍又一遍。」正確。

你的缺點是,它應該如何工作。這就是爲什麼只有當單元格爲零時纔會分配&啓動一個新的單元格。所以你分配和初始化並設置顏色並在if語句中添加子視圖。然後在if(cell==nil)之後,根據indexPath傳入的變量,您知道您有一個有效的單元格來填充一些數據。

問題是,現在您在設置單元格時爲零,並分配所有顯示的數據根據indexPath傳入。問題是單元不是第二次使用它,所以數據永遠不會改變。

爲了進一步解決您的速度評論,我將使用舊的備用示例。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     UILabel *hugeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, cell.frame.size.width, cell.frame.size.height)]; 
     hugeLabel.tag = 300; 
     [cell addSubview:hugeLabel]; 
    } 
    [(UILabel *)[cell viewWithTag:300] setText:[arrayOfStrings objectAtIndex:indexPath.row]]; 
    return cell; 
} 

如果你看一下上面的例子,你會看到我們添加一個UILabel到小區設置它的標籤300再經過if語句,我們將有一張全新的細胞或細胞再利用文本已經在標籤中。無論採用哪種方式,只要將現有標籤的文本更改爲應該考慮的行。這樣我們就避免了重複創建視圖。在緩存

如果你是死心塌地的UITableViewCells你可以這樣做是這樣的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row < _cells.count){ 
     return [_cells objectAtIndex:indexPath.row]; // _cells is an NSMutableArray setup in viewDidLoad 
    } 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@""]; 
    cell.textLabel.text = [source objectAtIndex:indexPath.row]; // source is an NSArray of NSStrings I set up in viewDidLoad 
    [_cells addObject:cell]; 
    return cell; 
} 

注意運行此設備上時在控制檯中看到Received memory warning不要感到驚訝,什麼是有效的簡單的東西往往不一樣。

+0

好的,謝謝。修改了一下,它有點工作。但是,你有沒有關於如何增加加載時間的想法,因爲我添加了不少子視圖,並且我想如果我保存了它,它會保存它的子視圖並重新加載。思考? – iosfreak

+0

在我的單元格中增加了一個NSLog ==零,它只出現了8次。即使當我向下滾動時,它也會重複它們。 – iosfreak

+0

出列進程加速了tableview滾動。你說你有大約8個細胞反覆重複。這很好,因爲這些tableviewcells只被創建一次。tableview的出列方法爲您提供了一個已經滾動屏幕的tableviewcell,以便您可以更改其內容並重新顯示它,而不是創建新的tableviewcell。 – NJones

0

你有它成立現在的方式,cell.selectionStylecell.backgroundColorcell.contentView.backgrounColor等,只得到當if (cell == nil)是真實的設定。您需要將該代碼移動到if語句塊之外,以便在dequeueReusableCellWithIdentifier:產生單元格時以及在清單中沒有單元格時不會產生任何內容(即零)時調用該代碼。