As Apple's document write, UISwitch
's function setOn(on: Bool, animated: Bool)
does not send action. It works fine before iOS 10, but it will send action after I call it in iOS 10. I call it in "ValueChanged" event to force switch back, so I got this event action twice. is it a bug in iOS 10?
问题:
回答1:
DispatchQueue.main.async {
sender.setOn(flag, animated: animated)
}
it works for me in Xcode 8.
but call UISwitch.setOn(_:animated:)
directly on main thread doesn't work.
Update
thanks to @codiction:
UISwitch.setOn(_:animated:)
can be called direclty on main thread, but can't be called directly in UISwitch ValueChanged action on iOS 10.
回答2:
The following solution resolves that issue. You should dispatch_async only if trying to call [UISwitch setOn:] within the action callback of that switch itself.
dispatch_async(dispatch_get_main_queue(), ^{
[switch setOn:YES animated:YES];
});
回答3:
I found these solutions to partially work. However, when I used switch.setOn(false, animated: true)
the onTint
color would appear white in the off position. I'm assuming this is a bug but I worked around this by using this:
switch.setOn(false, animated: true)
switch.onTintColor = .clear
Don't forget to reset the onTint
color when you're ready to allow the switch to be toggled on, if applicable.
switch.onTintColor = <your custom color> // Use nil to use the default onTint for UISwitch
Hopefully this helps save someone a little time.