UIControl(addTarget:action:forControlEvents :) @selector参数

时间:2010-09-12 22:14:20

标签: iphone selector uicontrol

@selector(updateStuff:)

这是自动发送参数:(id)sender。是否可以将其覆盖为其他内容?在我的特定用法中,实际发送者毫无意义。

我正在使用UITableView并在每个单元格的UIAccessoryView插槽中设置UISwitch。最初,我将UISwitch添加到单元初始化之外的UIAccessoryView,这允许每个UISwitch成为一个唯一的实例。然而,当在iPhone 3G上向下滚动长列表时,这会产生明显的延迟。如果我在初始化时将UIAccessoryView添加到单元格中,它可以出列而不是实例化,并大大减轻了滞后。不幸的是,这样做的代价是,实例并不是表中每个UISwitch唯一的,并且:(id)发送者变得毫无意义。

我需要两件事之一......

  1. 一种覆盖参数的方法 与@selector关联,所以我可以 替换:(id)发件人
  2. 或者比我使用的更好的策略 跟踪UISwitches。
  3. 在创建/出列单元格之后,我总是可以使用添加UISwitch,但它非常慢且效率低。谢谢你的帮助。

    此致 ž@ķ!

3 个答案:

答案 0 :(得分:4)

我遇到了类似的问题,我解决它的方法是设置发件人的“tag”属性,每个视图都有这个属性,目的是帮助识别它。因此,在创建/出列单元格时,设置标记以标识单元格,并在操作上使用[sender tag]来获取单击的上下文

答案 1 :(得分:1)

很多很多方面:

  • 设置标记。
  • 设置“关联对象”(请参阅​​objc_setAssociatedObject())
  • UISwitch子类。添加一些属性。
  • 子类UITableViewCell。添加一些属性。向上导航视图层次结构,直到到达表格视图单元格(类似while (v && ![v isKindOfClass:[UITableViewCell class]]) {v = v.superview; })。
  • 向上导航视图层次结构,如上所述。致电[tableView indexPathForCell:(UITableViewCell*)v]
  • 如果有多个表视图,您可以继续向上导航,直到您点击UITableView ...

答案 2 :(得分:0)

我编写了一个UISwitch子类,其中包含基于块的处理器,用于更改值控制事件,这有助于在尝试跟踪哪个交换机的值发生更改时有所帮助。理想情况下,我们可以使用组合而不是子类化来做类似的事情,但这很适合我的需要。

https://gist.github.com/3958325

你可以像这样使用它:

ZUISwitch *mySwitch = [ZUISwitch alloc] init];

[mySwitch onValueChange:^(UISwitch *uiSwitch) {
        if (uiSwitch.on) {
            // do something
        } else {
            // do something else
        }
    }];

您也可以在XIB文件中使用它,方法是将开关拖到视图上,然后将其类更改为ZUISwitch