【问题标题】:programmatically toggle UISwitch, prevent IBAction function以编程方式切换 UISwitch,防止 IBAction 功能
【发布时间】:2018-04-12 12:14:16
【问题描述】:

我有一个UISwitch,当它被切换时,IBAction 被触发:

@IBAction func mySwitchToggled( switch_: UISwitch ) {
        ...
}

所以,当用户切换开关时,会调用上述函数。

在某些时候,我还需要以编程方式切换开关:

mySwitch.setOn(false, animated: false) //It triggers the IBAction function

以上代码触发了IBAction函数。

对于我的特殊要求,我需要在用户切换开关时触发 IBAction 功能,但是当以编程方式切换开关时,我不希望触发 IBAction 功能。

如何在触发 IBAction 功能的情况下以编程方式切换我的开关?

【问题讨论】:

  • 不会调用函数,mySwitchToggled是Value Changed函数,对吗?
  • 我认为你需要一个标志,如果标志为真那么你忽略 mySwitchToggled 动作,并在你的 mySwitchToggled 动作中将该标志更改为假
  • 是的,我可以,但是在哪里将标志设置为false
  • 在你的 mySwitchToggled 操作@Leem.fin
  • @Leem.fin 检查我的答案

标签: ios uiswitch


【解决方案1】:

嗯……很有趣。它在我的项目中被触发

我没有足够的代表发表评论,所以我将其作为答案发布在 PPL 他的答案上,你检查过你的网点吗?大多数情况下,故事板会与您的其他 IB 动作保持连接,从而导致它们同时触发。 (移除现有网点并实施价值变更,应该可以)

这是另一种(有些骇人听闻的)解决方案,通过在代码调用开关时实现跳过布尔值:

var skip: Bool = false

@IBAction func mySwitchToggled( switch_: UISwitch ) {
    guard !skip else {
        skip = false
        return
    }
    // do stuff
}

func someFunc() {
    // called it like this
    skip = true
    mySwitch.setOn(false, animated: false)
}

【讨论】:

  • 谢谢。它对我帮助很大:)
【解决方案2】:

请在下面找到,这里swcValueChangedValue Changed 函数,只有在用户切换开关时才会调用。

@IBAction func swcValueChanged(_ sender: Any) {
    print("Switch value changed")
}

这里在按钮点击事件上,上面的函数不会调用。

@IBAction func btnTapped(_ sender: Any) {
    swcTemp.setOn(!swcTemp.isOn, animated: true)
}

【讨论】:

  • 嗯...有趣。它在我的项目中被触发。
  • :D 不知道怎么称呼它:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 2010-10-02
  • 2016-08-29
  • 2011-01-15
相关资源
最近更新 更多