我正在尝试将UISwitch
放入UITableView
。我看过这个问题here和here。由于表视图重用了我需要保存单元格状态的单元格。我通过使用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)
答案 0 :(得分:2)
通常,处理此问题的最简单方法是将某些内容直接粘贴到您创建的UISwitch中,以便您可以直接从交换机中获取信息。
方便的是,UISwitch是UIControl的子类,因而是UIView,它有一个tag属性,可以用来存储你需要的任何值。
每次调用cellForRowAtPath:时,都会在单元格上设置标记值(不仅在创建新单元格时,还在重用现有单元格时),并确保更改状态UISwitch。
iOS将确保创建新单元格并重用现有单元格,因此您不必担心过度使用或重复使用。
在回调方法中,将“row”值拉出标记(将其存储在cellForRowAtPath :)中,并使用它来访问字典。
此外,正如之前的评论者所提到的,请确保您已初始化NSMutableDictionary和您想要的任何默认值。
希望这有帮助。
答案 1 :(得分:1)
最可能的原因是self.selectedItems
是nil
。您可能没有初始化它。你可能想要一个
self.selectedItems = [NSMutableDictionary dictionary];
在viewDidLoad
方法中。