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