iPhone UISwitch和TableView保存状态

时间:2011-07-12 16:53:30

标签: iphone objective-c uitableview

我正在尝试将UISwitch放入UITableView。我看过这个问题herehere。由于表视图重用了我需要保存单元格状态的单元格。我通过使用NSMutableDictionary实现此目的,其中单元格的行映射UISwitch的状态(true或false)。我遇到的问题是在TableView中识别UISwitch的索引。我认为@selector语句出了问题。这让我在过去的两个小时里疯狂了。这是正确的方法吗?为什么我要更改它始终使用相同日志消息报告的任何UISwitch的状态(见下文)。任何帮助是极大的赞赏。以下是我的代码的一些片段....

的cellForRowAtIndexPath

//Need to construct
if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    UISwitch *temp = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];

    //Add a callback when the value is changed
    [temp addTarget:self action:@selector(switchButtonChanged:forEvent:) forControlEvents:UIControlEventValueChanged];

    //Set the acessory view to the UISwitch
    cell.accessoryView = temp;
}

回调方法

- (void)switchButtonChanged:(id)sender forEvent:(UIEvent *)event
{
    UISwitch *tempSwitch = (UISwitch *) sender;
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:[[[event touchesForView:sender] anyObject] locationInView:tableView]];

    NSNumber *isChecked = [[[NSNumber alloc] initWithBool:tempSwitch.on] autorelease];
    NSNumber *row = [[[NSNumber alloc] initWithInteger:indexPath.row] autorelease];

    [self.selectedItems setObject:isChecked forKey:row];

    NSLog(@"Row %@ is now %@", row, [self.selectedItems objectForKey:row]);
}

日志

Row 0 is now (null)
Row 0 is now (null)
Row 0 is now (null)

2 个答案:

答案 0 :(得分:2)

通常,处理此问题的最简单方法是将某些内容直接粘贴到您创建的UISwitch中,以便您可以直接从交换机中获取信息。

方便的是,UISwitch是UIControl的子类,因而是UIView,它有一个tag属性,可以用来存储你需要的任何值。

每次调用cellForRowAtPath:时,都会在单元格上设置标记值(不仅在创建新单元格时,还在重用现有单元格时),并确保更改状态UISwitch。

iOS将确保创建新单元格并重用现有单元格,因此您不必担心过度使用或重复使用。

在回调方法中,将“row”值拉出标记(将其存储在cellForRowAtPath :)中,并使用它来访问字典。

此外,正如之前的评论者所提到的,请确保您已初始化NSMutableDictionary和您想要的任何默认值。

希望这有帮助。

答案 1 :(得分:1)

最可能的原因是self.selectedItemsnil。您可能没有初始化它。你可能想要一个

self.selectedItems = [NSMutableDictionary dictionary];

viewDidLoad方法中。