监听用户在 iOS 交换机上执行的状态更改

Listen user performed state changes on an iOS Switch

在我的 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 中创建该单元格并为其设置一个操作出口。它只会初始化一次。