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

Posted

技术标签:

【中文标题】UIControl (addTarget:action:forControlEvents:) @selector 参数【英文标题】:UIControl (addTarget:action:forControlEvents:) @selector arguments 【发布时间】:2010-09-12 22:14:20 【问题描述】:

@selector(updateStuff:)

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

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

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

    一种覆盖参数的方法 关联到@selector,所以我可以 替换 :(id)sender 或者比我使用的策略更好的策略 跟踪 UISwitches。

我总是可以在单元格创建/出列后添加 UISwitch,但它非常缓慢且效率低下。感谢您的帮助。

真诚地, Z@K!

【问题讨论】:

这个问题的答案是选项#2,这使得#1 是不必要的。 【参考方案1】:

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

【讨论】:

由于每个对象只有一个标签,我看不出这与使用指针有何不同。我的问题是一个开关将被回收用于两个不同的指标。这就是为什么我需要覆盖@selector 诀窍是将唯一需要的数据设置为标签,而不是重新创建 UISwitch,这是对出队操作的昂贵操作,因此您在拥有唯一 UISwitch 的同时获得了性能提升 你能扩展一下吗?你能告诉我如何将(重复使用的开关 - 因此标签)链接到一组指标吗?它不适合我。 尝试将数组索引保存在相关标签中,这样当你取回标签时就可以得到它 这就是我所追求的;你不能。标签标识一个重用单元格,就唯一标识它而言,它只是指向该单元格的指针实际上没有什么不同。每个标签都必须以某种方式链接到多个指标。【参考方案2】:

很多很多方法:

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

【讨论】:

再一次,我看不出这与使用指针有何不同。我的问题是一个开关将被回收用于两个不同的指标。添加属性无济于事,标签无济于事。我不知道 objc_setAssociatedObject()) 是什么,也不知道从哪里获取有关它的信息。我认为您没有完全阅读我的问题。如果我之后添加附件视图,并为每个指示器使用一个独特的开关,它工作正常,但这真的很慢。这就是为什么我需要覆盖@selector【参考方案3】:

我已经编写了一个 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

【讨论】:

以上是关于UIControl (addTarget:action:forControlEvents:) @selector 参数的主要内容,如果未能解决你的问题,请参考以下文章

UIControl

##DAY5 UIControl及其子类

UIControl及其子类

UIControl笔记

UIControl && UIImage

CAShapeLayers 未在自定义子类 (UIControl) 中绘制