这听起来微不足道,但我注意到有些奇怪。我已经为 UISwitch 的 Value Changed 事件连接了一个处理程序。我期望的是每次调用处理程序时,开关的值都会改变。但实际上并非总是如此。如果您快速打开/关闭开关,则可以连续调用处理程序,开关的状态相同(在我的特定应用程序中,这是一个问题)。所以我想知道是否有其他人注意到这种行为并找到了一个好的解决方案。
问问题
32373 次
8 回答
19
-(void) createSwitch
{
self.searchExistSearchNewSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0,0,0,0)];
[self.searchExistSearchNewSwitch addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:self.searchExistSearchNewSwitch];
}
- (void)switchValueChanged:(UISwitch *)theSwitch
{
BOOL flag = theSwitch.isOn;
}
于 2013-10-17T14:53:38.307 回答
9
在 iOS 11 中引入了一个新的 UISwitch 错误,因此我不建议订阅值更改事件。否则每次以编程方式更改属性时都会触发您的UISwitch
回调isOn
。
反而:
- 订阅内部事件的修饰:
let switch = UISwitch()
switch.addTarget(self, action: #selector(onSwitchValueChanged), for: .valueChanged)
- 实现回调方法:
func onSwitchValueChanged(_ switch: UISwitch) {
}
- 现在,当您以编程方式更改
isOn
值时,它不会触发onSwitchValueChanged
方法。
switch.isOn = !switch.isOn // 'onSwitchValueChanged' is not triggered
于 2017-12-06T08:51:55.140 回答
8
获取处理程序中的开关状态:
- (void)valueChanged:(UISwitch *)theSwitch {
BOOL flag = theSwitch.on;
}
于 2010-11-04T16:50:01.567 回答
7
您所做的每一次按下都不会立即打开/关闭开关。如果开关处于关闭位置,您可以在它动画到打开位置之前按几下。这些按下中的每一个都被解释为“打开开关”,因为在动画完成之前它不会被视为“打开”。尽管值实际上还没有改变,但每次按下都会得到一个“valueChanged”回调。
于 2011-02-10T05:45:44.860 回答
1
这是一个适合我的解决方案。它还会在开关更改时发送属性“将/确实更改”通知。该事件还可以正常运行,因为正确维护了之前和之后的值。
@interface MySwitch : UISwitch
@end
@implementation MySwitch
{
BOOL _previousValue;
BOOL _returnPreviousValue;
}
- (instancetype) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
if (!self) return nil;
_previousValue = self.isOn;
[self addTarget: self action: @selector(_didChange)
forControlEvents: UIControlEventValueChanged];
return self;
}
- (instancetype) initWithFrame: (CGRect) frame
{
self = [super initWithFrame: frame];
if (!self) return nil;
[self addTarget: self action: @selector(_didChange)
forControlEvents: UIControlEventValueChanged];
return self;
}
- (BOOL) isOn
{
return (_returnPreviousValue)
? _previousValue
: [super isOn];
}
- (void) setOn:(BOOL) on animated: (BOOL) animated
{
[super setOn: on animated: animated];
_previousValue = on;
}
- (void) _didChange
{
BOOL isOn = self.isOn;
if (isOn == _previousValue) return;
_returnPreviousValue = true;
[self willChangeValueForKey: @"on"];
_returnPreviousValue = false;
_previousValue = isOn;
[self didChangeValueForKey: @"on"];
}
@end
于 2014-07-15T06:36:59.440 回答
0
当您关闭/打开开关时,“值已更改”已被调用。因此您可以通过调用 valueChanged 上的方法来检测开关的变化。
于 2012-07-21T10:20:42.560 回答
0
记录最后一个状态,以便您可以判断其状态是否已更改或已被相同状态触发。
于 2010-11-04T16:32:50.340 回答
0
我的问题是一个愚蠢的问题......我期待enabled
值会改变,但显然这不是在开关切换时检查的正确值,on
或者isOn
是正确使用的东西。
于 2017-09-11T17:24:57.703 回答