在UITableViewCell中UISwitch的UIControlEventValueChanged,在滚动到视图时触发

时间:2012-04-01 19:48:47

标签: iphone objective-c ios uitableview

任何人都可以解释为什么在桌面视图中UISwitch为ON时会触发UIControlEventValueChanged,而不是在滚动时它是否为OFF?

我在表格视图中有100多行,当UISwitch关闭时从Core Data中提取数据UIControlEventValueChanged未被触发但如果我在切换(表格行)进入视图时将开关更改为ON则会触发UIControlEventValueChanged。

我正在使用以下内容进行单元格配置

[customCell.seenSwitch addTarget:self action:@selector(seenSwitchChanged:) forControlEvents:UIControlEventValueChanged];

方法seenSwitchChanged,更改Core Data中的BOOL值以匹配开关状态。

当快速滚动桌面视图时,当触发UIControlEventValueChanged时,它会断断续续地停滞。我猜是因为tableview正在查找来自CoreData的数据而且seeSwitchChanged也试图访问CoreData

如果我注释掉上面这一行,那么tableview会顺利滚动。

希望解释清楚。

非常感谢

马特

修改

-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    ECCustomCell *customCell = (ECCustomCell *)cell;
    ECPerson *person = [self.fetchedResultsController objectAtIndexPath:indexPath];

    customCell.name.text = [person valueForKey:@"name"];
    customCell.seenSwitch.on = [[person valueForKey:@"seen"] boolValue];

    [customCell.seenSwitch addTarget:self action:@selector(seenSwitchChanged:) forControlEvents:UIControlEventValueChanged];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCell"];
    [self configureCell:cell atIndexPath:indexPath];

    return cell;    
}

1 个答案:

答案 0 :(得分:0)

我认为你应该检查nil的出队结果并在发生这种情况时分配一个单元格。我也认为你的理论对于动态设置开关是正确的。一种补救措施可能是在表视图上使用滚动视图委托挂钩来更懒惰地设置仅可见开关的值。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self setMySwitches];
}

- (void)setMySwitches {

    for (NSIndexPath *path in [self.tableView indexPathsForVisibleRows]) {
        // like your cell config logic
    }
}