ios - 监听用户在 iOS Switch 上执行的状态更改

标签 ios objective-c uicontrolevents

在我的 iOS 应用程序中,我有 UITableView,在一些单元格中有一个 Switch。

我已经通过以下方式在 Switch 上设置了一个监听器:

[cell.toggle addTarget:self action:@selector(onSwitchToggle:) forControlEvents:UIControlEventValueChanged];

开关状态也可以从程序本身更新,而不仅仅是用户按下它。我在使用 UIControlEventValueChanged 时遇到了一些问题,有时它似乎触发了比应有的更多的事件。所以我想知道这是否是(由用户)监听 Switch 状态变化的唯一方法...?

最佳答案

我猜测您正在 cellForRowAtIndexPath 内设置 addTarget,这是您的主要问题。

重复使用单元格(例如滚动)会将该目标多次添加到特定单元格。

最快的解决方案是将您的代码更改为:

[cell.toggle removeTarget:nil 
                   action:NULL 
         forControlEvents: UIControlEventValueChanged];
[cell.toggle addTarget:self action:@selector(onSwitchToggle:) forControlEvents:UIControlEventValueChanged]; 

这基本上可以防止目标被多次添加到切换中。这不是最漂亮的解决方案,但值得考虑。

想到的一些更好的解决方案:

  • awakeFromNib 下的单元子类中添加目标。

  • StoryBoard 中创建该单元并为其设置一个操作导出。它只会初始化一次。

关于ios - 监听用户在 iOS Switch 上执行的状态更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33036645/

相关文章:

swift - 如何让 UIButton 按下以在 Swift 中的 UICollectionViewCell 中工作?

objective-c - UIButton UIControlEventTouchUpInside 不会触发,但 UIControlEventTouchDown 会触发

ios - 创建自定义 UITableView 索引 iOS

IOS:UISearchBar 部分覆盖带有提示的 UINavigationBar

iphone - 为 UIImagePicker 提供您自己的 UIImage。

ios - 表格 View 元素的重复

IOS7 : uisearchdisplaycontroller always show scope bar

html - 如何在 UIWebView 中显示 HTML 代码?

ios - 使用 URLSession 为 SwiftUI View 加载 JSON 数据

ios - 如果我们不在 init 方法中检查 "if (self)"会发生什么?