对于 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 while 格式化输出

模板能否在 % if % 和 % else % 场景中保存块

if循环判断

我的 Django 模板中的“Else if”语句出现在 HTML 标头块之后

if 语句

if-else 中的块语句