我应该在addTarget之前删除目标

时间:2012-04-23 17:32:23

标签: objective-c ios5

UIControl - changing assigned selectors: addTarget & removeTarget

说明您应该在更改之前删除目标。但是如果我在 cellForRowAtIndexPath 中设置目标呢?我是否应该在再次添加目标之前删除它,即使它没有改变?如果我不删除它或它只是覆盖它,它会调用该方法两次吗?

[cell.cellSwitch removeTarget:self action:@selector(notifySwitchChanged:) forControlEvents:UIControlEventValueChanged];
[cell.cellSwitch addTarget:self action:@selector(notifySwitchChanged:) forControlEvents:UIControlEventValueChanged];

2 个答案:

答案 0 :(得分:1)

我没有添加/删除目标,而是发现如果我已经将UITableViewCell子类化,我将添加一个新的委托并将委托设置为视图控制器。这样,调用委托的任何方法都可以传入整个单元格,因此我可以通过调用UITableView的{​​{1}}方法获取单元格的索引路径。

答案 1 :(得分:0)

根据我的经验,它只会被调用一次。

但IMO 最好始终使用 removeTarget因为代码可以在将来更改。有一天,您可能需要添加多个目标和选择器。

是安全,可扩展且可维护的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = // code with reuse identifier ...
    if(cell == nil)
    {
        // making view for cell ....
    }

    // myAction will be called ONLY ONCE after many times of scrolling
    [cell.myButton addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside]; 

    return cell;
}