要使用代碼:
- (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
不要感到驚訝,什麼是有效的簡單的東西往往不一樣。
好的,謝謝。修改了一下,它有點工作。但是,你有沒有關於如何增加加載時間的想法,因爲我添加了不少子視圖,並且我想如果我保存了它,它會保存它的子視圖並重新加載。思考? – iosfreak
在我的單元格中增加了一個NSLog ==零,它只出現了8次。即使當我向下滾動時,它也會重複它們。 – iosfreak
出列進程加速了tableview滾動。你說你有大約8個細胞反覆重複。這很好,因爲這些tableviewcells只被創建一次。tableview的出列方法爲您提供了一個已經滾動屏幕的tableviewcell,以便您可以更改其內容並重新顯示它,而不是創建新的tableviewcell。 – NJones