使用 NSTimer 时如何更改 userInfo 中的数据?

Posted

技术标签:

【中文标题】使用 NSTimer 时如何更改 userInfo 中的数据?【英文标题】:How to change data in the userInfo when using NSTimer? 【发布时间】:2015-06-04 13:35:15 【问题描述】:

我使用 NSTimer 每 1 秒重复一个函数。我使用scheduledTimerWithTimeInterval 方法的userInfo 参数。我需要更新这个userInfo中的数据。

override func viewDidLoad() 
    super.viewDidLoad()

    NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "minus:", userInfo: ["number": 100], repeats: true)


func minus(timer: NSTimer) 
    var userInfo = timer.userInfo as! Dictionary <String, Int>
    println(userInfo["number"]!)
    userInfo["number"] = userInfo["number"]! - 1

我希望打印的是 100 99 98 97。但是当代码运行时我得到 100 100 100 100。

函数minus第一次运行时,我想我已经把userInfo的数据从100改成了99。但是minus第二次运行时userInfo的数据还是100。

如何更新userInfo的数据?

谢谢。

【问题讨论】:

【参考方案1】:

我很惊讶这不是构建错误/崩溃,因为 userInfo 是只读的。

您可以将其设为NSMutableDictionary,这样您就不会更改userInfo 指针,您只是更改它指向的对象的内容,但我想说的是,您真的应该只使用实例变量。 ..

【讨论】:

【参考方案2】:

您不能更改计时器中的 userInfo 对象。 userInfo 是一个只读属性。因此,显而易见的解决方法是将可变对象存储为 userInfo。例如 NSMutableDictionary* 或您自己的类。

但是,您从不可变的 NSDictionary 开始,然后将其转换为 Swift 字典。不要那样做。您需要直接访问存储的对象,即 NSMutableDictionary。

【讨论】:

以上是关于使用 NSTimer 时如何更改 userInfo 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

错误无法下标“AnyObject?”类型的值在 NSTimer 的 userInfo 中使用数组

NSTimer 中的 UserInfo 没有传递正确的信息 - Swift

NSTimer - 如何在 Swift 中延迟

无法弄清楚如何使用 NSTimer 更改视图

Swift NSTimer 将 userInfo 检索为 CGPoint

如何用 CADisplayLink 替换 NSTimer?