2014-04-29 77 views
0

我的UITableViewCell原型中有一個UISwitch。UITableView中的UISwitch Bug

問題是,當我打開其中一個開關時,其中一個未顯示的開關也打開。

這不會發生在顯示所有單元格的iPad版本中。

下面是一些代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *identifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    Notification *notification = [notifications objectAtIndex:indexPath.row]; 

    UILabel *titleLabel = (UILabel *) [cell viewWithTag:100]; 
    UISwitch *newsSwitch = (UISwitch *) [cell viewWithTag:101]; 
    UIImageView *imageView = (UIImageView *) [cell viewWithTag:102]; 

    [titleLabel setText:[notification name]]; 
    [imageView setImage:[UIImage imageNamed:[notification image]]]; 

    BOOL isOn = [storage boolForKey:[NSString stringWithFormat:@"notification_%@", [notification name]]]; 
    [newsSwitch setOn:isOn]; 
    [newsSwitch setTag:indexPath.row]; 
    [newsSwitch addTarget:self action:@selector(didChangeStateForSwitch:) forControlEvents:UIControlEventValueChanged]; 

    return cell; 
} 
+0

你的意思是,還沒有在屏幕上的開關也打開?然後這個錯誤很可能出現在你的'didChangeStateForSwitch:'方法中,請更新你的問題並告訴我們這個方法的代碼。 – DarkDust

+0

我從didChangeStateForSwitch中刪除了代碼:並且行爲相同。 –

回答

1

你的問題是,你首先通過它的標籤查詢開關:

UISwitch *newsSwitch = (UISwitch *) [cell viewWithTag:101]; 

但後來對,您更改標籤:

[newsSwitch setTag:indexPath.row]; 

所以當單元格將得到[R eused,交換機將不會被發現,因爲現在它的標籤不再是101了。因此,交換機將停留在舊狀態。

您可以通過在查詢交換機後添加NSLog(@"Switch: %@", newsSwitch);來輕鬆進行驗證。你會發現它將輸出Switch: (null)那些你有錯誤的開關值的行。

解決方法是不修改標籤。

問題是,你如何記住開關的哪一行?一種方法是:

- (void)didChangeStateForSwitch:(id)sender 
{ 
    NSIndexPath *indexPath = [myTableView indexPathForCell:[sender superview]]; 
    ... 
} 

另一種可能性是使用associated objects

+0

你的回答是正確的,那就是問題所在。但解決方案並不適合我。我以編程方式創建了UISwitch。它現在工作正常。謝謝。 –

1

第一次當你加載你正在與標籤101的視圖switch.Few系的細胞後,你是新的標籤設置這個開關,下一次當您嘗試使用標記101來查看它不存在的視圖。 [newsSwitch setTag:indexPath.row];刪除這條線,然後再試一次

你可以得到該指數路徑@DarkDust建議

- (void)didChangeStateForSwitch:(id)sender 
{ 
NSIndexPath *indexPath = [myTableView indexPathForCell:[sender superview]]; 
... 
} 
+0

「[storage boolForKey:[NSString stringWithFormat:@」notification _%@「,[notification name]]];」是不足夠的? –

+0

之前發生過我。就像@wootage說你應該保持你的開關狀態在一個數組中,並將其設置在你的cellForRowAtIndexPath中 – Pancho

+0

你必須實現CustomTableViewCell,並給每個開關uniq標籤,以解決它在didChangeStateForSwitch! –