对于 iO,我有一个 if / else 代码块,对 UISwitch 中的变化做出反应。在某些情况下如何将 uiswitch 设置回关闭?
Posted
技术标签:
【中文标题】对于 iO,我有一个 if / else 代码块,对 UISwitch 中的变化做出反应。在某些情况下如何将 uiswitch 设置回关闭?【英文标题】:In swift for iOs,I have an if / else block of code, reacting to changes in a UISwitch. How to set the uiswitch back to off in some situations? 【发布时间】:2019-01-16 16:32:53 【问题描述】:在我的 swift ios 应用程序中,我有一个简单的 UISwitch 控件。我已将值更改插座连接到我的@IBAction。代码如下所示:
@IBAction func userDidSelectVisibiltySwitch(_ sender: Any)
if self.visibilitySwitch.isOn
if badCondition
self.visibilitySwith.setOn(false, animated: false)
return
else // Strangely, it executes the else (I think because the compiler is evaluating the isOn condition again when it arrives to the else
// work to be done if the user has turned off the switch
我怀疑在这种情况下,由于我在评估 else 之前关闭了开关,因此编译器会执行 else 语句,因为它会再次评估上面的 isOn 表达式。但是,鉴于我放置了“返回”指令,这怎么可能呢?这真的超出了我的范围。对我的嫌疑人的确认来自以下事实:如果我使用 GCD dispatch_async 'self.visibilitySwith.setOn(false, animated: false)' 语句,它可以在不执行 else 语句的情况下正常工作,因为 else 的评估需要在我的声明关闭控件之前放置。我的代码现在看起来像这样,并且可以正常工作:
@IBAction func userDidSelectVisibiltySwitch(_ sender: Any)
if self.visibilitySwitch.isOn
if badCondition
DispatchQueue.main.async
self.visibilitySwith.setOn(false, animated: false)
return
else // In this case it is normal, it does not execute the else
// work to be done if the user has turned off the switch
我认为在这种情况下我错过了一些重要的 swift 。任何帮助是极大的赞赏。我已经提供了一个解决方案,但我想了解这个问题。非常感谢
【问题讨论】:
调用setOn(_:animated:)
函数不应触发IBAction。
【参考方案1】:
与其通过sender
参数访问UISwitch
,不如直接访问我假设的IBOutlet
值。您可以按如下所述访问发件人,而不是这种方法:
@IBAction func userDidSelectVisibiltySwitch(_ sender: UISwitch)
if sender.isOn && badCondition
sender.setOn(false, animated: false)
else // In this case it is normal, it does not execute the else
// work to be done if the user has turned off the switch
您的修复工作的原因可能是由于调度调用引入了轻微延迟,这允许IBOutlet
值更新其值。
我还继续结合您的if
语句,因为您提供的示例不需要嵌套检查。
根据 RMADDY 的评论更新
这个解决方案让我有点代码味道,经过进一步调查,我能够重现 OP 描述的场景。这是通过在 Storyboard 中设置操作来完成的,如下所示:
使用该设置,我看到以下内容:
OP 发布的原始代码会失败 按照 OP 的演示添加 DispatchQueue 将在短暂延迟后更正切换 我发布的解决方案可以正常工作假设这是 OP 所做的,那么第一个更正是将事件更改为 Value Changed
。然后,正如 rmaddy 在评论中所述,无论您使用参数还是 IBOutlet
,这都会成功。根据最初的问题,我的解释是存在插座值和接口中的开关状态不同步的问题。
【讨论】:
此更改对 OP 的原始代码应该没有影响。无论是通过sender
还是通过插座访问开关都没有区别。它是指向同一个对象的指针。
@rmaddy 我完全同意,在您发表评论后,我进一步调查,看看我是否可以进入 OP 描述的确切场景。我可以通过将动作设置为开关上的主要动作触发器来做到这一点。这样做,我看到它在没有 OP 调度的情况下失败,调度成功,并且我的帖子成功。基于此,我将使用此信息更新答案。以上是关于对于 iO,我有一个 if / else 代码块,对 UISwitch 中的变化做出反应。在某些情况下如何将 uiswitch 设置回关闭?的主要内容,如果未能解决你的问题,请参考以下文章
模板能否在 % if % 和 % else % 场景中保存块