UISwitch 无法正常工作

Posted

技术标签:

【中文标题】UISwitch 无法正常工作【英文标题】:UISwitch not Working Properly 【发布时间】:2015-10-24 04:10:09 【问题描述】:

在我的代码中,我通过NSUserDefaults 存储UISwitch 状态。但是当窗口重新加载时,所有UISwitche's 都打开了。这是我的sn-p代码:

   @IBAction func switchState(sender: AnyObject) 

    let standardDefaults = NSUserDefaults.standardUserDefaults()    
    if mySwitch.on
        standardDefaults.setObject("On", forKey: "switchKey")
    
    else   
        standardDefaults.setObject("Off", forKey: "switchKey")   
    
    standardDefaults.synchronize()



override func awakeFromNib() 
    super.awakeFromNib()
    let standardDefaults = NSUserDefaults.standardUserDefaults()
    self.mySwitch.on = standardDefaults.stringForKey("switchKey") == "On"

我相信它在awakeFromNib 部分,但我无法弄清楚。请帮忙。

谢谢。

【问题讨论】:

【参考方案1】:

您的实现中有多余的代码。您可以直接将bool 保存在NSUserDefaults 中,而不是存储String 并稍后对其进行操作。

你应该这样做:

保存数据时:

@IBAction func switchState(sender: AnyObject) 
    NSUserDefaults.standardUserDefaults().setBool(mySwitch.on, forKey: "switchKey")

检索数据时:

override func awakeFromNib() 
    super.awakeFromNib()
    self.mySwitch.on = NSUserDefaults.standardUserDefaults().boolForKey("switchKey")

另外,值得注意的是NSUserDefaults 开始为空,因此请求密钥返回nil,并在nil 上调用boolValue 返回false。如果您希望您的开关以默认值开始,您可以在appDidFinishLaunching 中实现它:

NSUserDefaults.standardUserDefaults().registerDefaults(["switchKey" : true])

【讨论】:

不用打电话synchronize 嘿,谢谢大家。非常快,这将保存开关状态,但是当表重新加载时,不会保存开关的各个状态。它们都打开或关闭取决于一个或所有开关的状态示例:我进入桌子并打开四个开关之一。然后我转到下一个窗口并回来,所有 4 个开关都打开了。如果我关闭所有开关然后走开然后回来,所有开关都保持关闭状态。我需要存储单独的行值吗?如果是这样,最好的方法是什么? 我以为你只有一个开关。如果你有多个开关,你可以通过在用户默认值中保存一个字典来欺骗它,其中键作为一些唯一的测试来唯一地标识一个开关和值作为开关的状态。 @Abhinav 终于成功了 我确实使用了NSDictionary,但没有将值存储到NSUserDefaults 我而是遍历字典然后使用if statement 测试值并使用@987654337 @ 现在完美了,再次感谢您的帮助,非常感谢。 很好...考虑到这个建议,这个答案可以接受吗?【参考方案2】:
self.mySwitch.on = standardDefaults.stringForKey("switchKey") == "On"

应该是

self.mySwitch.on = (standardDefaults.stringForKey("switchKey") == "On")

【讨论】:

【参考方案3】:

试试这个..

  self.mySwitch.on = standardUserDefaults().setBool(true, forKey: "on")

希望对你有帮助。

【讨论】:

这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 @PetroKorienev 这怎么不能提供答案?它提出了一个合理的解决方案。如果您认为这是不正确的,您应该投反对票并发表评论来解释您的疑虑。 考虑添加一两句话的解释,为什么作者的代码是错误的,而你的sn-p是对的。

以上是关于UISwitch 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 中的 UISwitch 几乎无法使用

如何调整UIPickerView,UISwitch等无法通过frame调整大小的大小

在 UIPopoverController 中设置 UISwitch 状态

addTarget:action:forControlEvents - TableView 中的 UISwitch - 发送方正常,事件始终为 0x0

Swift UISwitch 第一次不工作

从弹出窗口中的 UISwitch 操作中隐藏 UIImageView (iPad)