2012-04-07 87 views
0

在我的應用程序中,我有一個詳細視圖,用戶可以在其中編輯例如某人的姓名,地址等屬性。UITableViewCell配件重複?

在兩個單元格中,他們不能選擇它們來編輯其內容,有一個正確的附件,一個UISwitch,但有時它不一致,但它們在我最後一節中複製到其他單元格上。

我一直在用精梳機掃描我的代碼幾十遍,並找不到該死的原因。什麼可能導致這個?下面是我使用的只是一個單細胞創建UISwitch代碼:

if (indexPath.section == 0 && indexPath.row == 1) 
{ 
    cell.textLabel.text = @"Confirmed"; 

    //Make the cell unselectable 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    //Create and add uiswitch 
    confirmedSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    [confirmedSwitch addTarget:self action:@selector(switchConfirmedStatus:) forControlEvents:UIControlEventValueChanged]; 
    [confirmedSwitch setOn:[venue.isConfirmed boolValue]]; 
    cell.accessoryView = confirmedSwitch; 
} 

所以你指望它只能出現在該小區,看到什麼奇怪與該代碼?我檢查了我的if語句,並且我所有的括號indexPath檢查都是正確的。

任何人看到此之前或有任何線索?

+1

聽起來像一個細胞重複使用問題。當你調用'dequeueReusableCellWithIdentifier:'你得到一個循環的單元格 - (你可能已經添加了這個單元格的開關)。你需要做什麼刪除你回收單元格時添加的視圖 – 2012-04-07 00:35:36

+1

這個代碼是否在cellForRowAtIndexPath中?你使用單個可重用的單元標識符嗎?如果是這樣,如果你得到一個緩存單元格,並且*不匹配你的分區/行測試,你會怎麼做? – 2012-04-07 00:35:57

+0

啊,我想這個線索的名字是'Reuse'!我正在使用這個,所以只需將我的其他單元的附件視圖修改爲零即可!猜猜我想的太多了,以爲它背後可能會有更大的問題。 – 2012-04-07 00:38:54

回答

3

問題是因爲reusability問題在UITableView。您可能對所有單元使用相同的identifier,這會導致cellForRowAtIndexPath在其他行中執行(當您向上和向下滾動時)。

這是一個常見問題,當您使用tableView開發應用程序時,在StackOverflow上有很多這樣的問題。

作爲一般解決方案,您需要執行其中任何一項。

  1. 當您爲每個單元指定dequeueReusableCellWithIdentifier時使用不同的標識符。這很簡單,你只需要爲它們分配不同的標識符。

  2. 子類你UITableViewController,並創建你自己的CustomTableViewController它將實現必要的組件在cell。我相信你將需要重寫set Layout Subviews方法。

0

採取在視圖中的陣列將出現和該索引處添加對象0此行和1爲所有其它行,然後在的cellForRowAtIndexPath檢查,如果陣列具有0,如果它已經然後把切換否則nill ..

for(int i =0;i<10;i++) 
{ 
    if(i==1) 
    { 
     [arrayForSwitch addObject:@"0"]; 
    } 
    else 
    { 
     [arrayForSwitch addObject:@"1"]; 
    } 
} 

然後在寫的cellForRowAtIndexPath條件

if([arrayForSwitch objectAtIndex:indexPath.row isEqualToString:@"0"]) 
{ 
    cell.accessoryView = confirmedSwitch; 
} 
else 
{ 

    cell.accessoryView =UITableViewCellAccessoryNone; 
} 

現在將保持相同