2014-02-16 16 views
0

試圖獲得的UITableViews如何工作更好地把握,所以我提供了一個背景問題,我不知道,這導致了我的實際問題,下面SegmentedControl在TableViewCell - 正確的方式來複用小區

1)當一個單元格首次創建時,可以包括

if (!cell) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

塊以初始化單元。之後,如果您正在重用單元格,if語句將被跳過,並且您將只使用您之前設置的之前的單元格來創建您正在創建的新單元格(是deque方法)。那是對的嗎?

2)使用Storyboard,我在原型單元格中創建了一個分段控件,用於兩個索引:「參加」和「不參加」,因此每個新單元格都會創建一個新的分段控件。創建單元格時不應該選擇索引,但是我遇到了麻煩,因爲在向表格中添加新的行/單元格時會選擇索引。

讓我們來看看這個場景:我創建了我的第一個單元格,「參加」和「不參加」都沒有按預期選中。現在說我選擇了其中一個索引,現在在我的表格中添加一個新的行/單元格。我的問題是,當我設置斷點,我期待在創建一個新的細胞,即這一步驟如下

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

的,我看我在調試器的selectedIndex,它存儲了相同的selectedIndex值剛剛修改過的單元格(即「參加」或「不參加」,無論我之前選擇的是0還是1)。我想這是有道理的,因爲我正在出隊一個可重用的單元,所以我猜標籤和這樣的指向前一個單元格?我能夠解決這個重置新單元的問題,在創建時沒有通過執行以下操作來選擇索引:

請注意,此處標記爲「公告」的新事件對象/單元的默認selectedIndex爲2) :

//set correct index 
    if ([[self.announcements objectAtIndex:indexPath.section] selectedIndex] == 2){ 
     [attendingSegmentedControl setSelectedSegmentIndex:UISegmentedControlNoSegment]; 
    } 
    else { 
     attendingSegmentedControl.selectedSegmentIndex = [[self.announcements objectAtIndex:indexPath.section] selectedIndex]; 
    } 

所以,現在當我創建一個新的小區,即使SegmentedControl的selectedIndex爲0或1(後我在先前的小區被選中),對於對象初始的selectedIndex是2。因此我強制SegmentedContorl的selectedIndex變爲沒有被選中。這是正確的方法嗎?對細胞dequeing問題,在閱讀了,這是我想出了自己

回答

0

1)這是正確的,但如果您使用的是故事板與原型細胞,或者如果您register自定義單元格級手動CellIdentifier那麼你可以最好的解決辦法調用

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

,它總是會返回一個正確的單元格(見documentation

2)你可以這樣做的,但爲了簡單起見,你甚至可以用-1(或UISegmentedControlNoSegment),而不是2新單元格的selectedIndex。這樣,你可以避開你的if (selectedIndex == 2),如果有一天你想添加第三段到你的分段控制,那麼它不會在那裏突破。

如果您在重新使用單元格之前需要重置更多屬性,那麼我建議您繼承UITableViewCell的子類並在prepareForReuse方法中執行重置工作。

相關問題