2013-08-04 56 views
-1

我在cellForRowAtIndexPath以下但不編譯因爲cell的作用域是if語句。寫這個的正確方法是什麼?無法從後返回一個變量的「如果」塊中,我宣佈它

int val=indexPath.row % 2; 
if(val==0) { 
    TRCell *cell = (TRCell*)[tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
    cell.topLabel.text = @"whatever"; 
    cell.subLabel.text = @"down below"; 
} else { 
    TROddCell *cell = (TROddCell*)[tableView dequeueReusableCellWithIdentifier:@"cell2"]; 
    cell.subLabel.text = @"down below in sub"; 
} 

return cell; 
+0

如何在不工作?它既是「'TRCell'」&''TROddCell'「是從UITableViewCell的子類,你應該是完美的。 –

+0

@MichaelDautermann他不好;他的代碼甚至不會編譯,因爲他試圖返回一個變量,這個變量對於他試圖返回的範圍來說是不可見的。 –

+0

您不能在聲明它的範圍之外引用一個變量。期。請移動聲明或移動參考。 –

回答

1

您也可以從若塊內返回你的細胞。

順便說一句,如果細胞否則等於,這將是更優雅動態地設置的顏色,並使用相同的小區的子類。

cell.contentView.backgroundColor = indexPath.row % 2 ? 
    kLightCellBackgroundColor : kDarkCellBackgroundColor; 
+0

thx爲答案,這個作品 – timpone

1

簡單,如你所說這是一個範圍問題。只需拉出退貨並將其添加到每個if語句中即可。

int val=indexPath.row % 2; 
if(val==0){ 
    TRCell *cell = (TRCell*)[tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
    cell.topLabel.text = @"whatever"; 
    cell.subLabel.text = @"down below"; 

    return cell; 
}else{ 
    TROddCell *cell = (TROddCell*)[tableView dequeueReusableCellWithIdentifier:@"cell2"]; 
    cell.subLabel.text = @"down below in sub"; 

    return cell; 
} 
+0

哦,來吧!移動單元格外的聲明if(初始化爲零,爲安全)。然後可以使用通用代碼。 –

+1

@HotLicks我不同意。我在答案中給出了兩種選擇,但這種方式更短,在我看來,更具可讀性。如果所有的定製都可以通過一個'cell'變量很容易地完成,我可能會同意你的觀點,把聲明拉出來會更清晰,但是因爲他正在處理'TRCell'和'TROddCell'這些需要它們的東西將其作爲這些類型進行演繹,將聲明拉出可將涉及的單元變量的數量從2增加到3,並將它們的賦值數量從2增加到4;我覺得這比有兩個回報更混亂。 –

3

你有兩個選擇:

1)讓您的return聲明它在哪裏,但if語句之前聲明cell,因此,它在相同的範圍內爲您return聲明。

int val=indexPath.row % 2; 
UITableViewCell *cell; 
if(val==0){ 
    TRCell *trCell = (TRCell*)[tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
    trCell.topLabel.text = @"whatever"; 
    trCell.subLabel.text = @"down below"; 
    cell = trCell; 
} else{ 
    TROddCell *trOddCell = (TROddCell*)[tableView dequeueReusableCellWithIdentifier:@"cell2"]; 
    trOddCell.subLabel.text = @"down below in sub"; 
    cell = trOddCell; 
} 

return cell; 

2)從定義的範圍返回cell

int val=indexPath.row % 2; 
if(val==0){ 
    TRCell *cell = (TRCell*)[tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
    cell.topLabel.text = @"whatever"; 
    cell.subLabel.text = @"down below"; 
    return cell; 
} else{ 
    TROddCell *cell = (TROddCell*)[tableView dequeueReusableCellWithIdentifier:@"cell2"]; 
    cell.subLabel.text = @"down below in sub"; 
    return cell; 
} 
+0

thx回答,這也適用。 – timpone