gpt4 book ai didi

ios - Swift - NSTimer 为 userInfo 参数传递了错误的值

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:49 26 4
gpt4 key购买 nike

我最近开始学习 Swift 编程语言,我喜欢它。为了帮助我学习,我一直在使用 XCode 7 开发几个简单的应用程序。其中一个应用程序是手电筒,其中一个功能是频闪灯。我决定使用 NSTimer 类来安排在设定的时间间隔调用手电筒切换功能,从而提供不错的频闪效果。我第一次破解定时器代码如下:-

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self.torch, selector: "toggleTorch:", userInfo: false, repeats: true)

正如您在此处看到的,我使用自己定制的 Torch 对象来处理闪光灯切换功能。我将指定为实例变量的 torch 对象作为目标参数传递,然后在 Torch 类中调用以下函数,我将其作为选择器传递:-

func toggleTorch(adjustingBrightness: Bool) -> Bool {
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

defer {
device.unlockForConfiguration()
}

guard device.hasTorch else {
return false
}
do {
try device.lockForConfiguration()

if !adjustingBrightness && device.torchMode == AVCaptureTorchMode.On {
device.torchMode = AVCaptureTorchMode.Off
}
else if !adjustingBrightness && device.torchMode == AVCaptureTorchMode.Off {
try device.setTorchModeOnWithLevel(brightnessLevel)
}
else if adjustingBrightness && device.torchMode == AVCaptureTorchMode.On {
try device.setTorchModeOnWithLevel(brightnessLevel)
}
} catch {
return false
}

return true
}

我遇到的问题是,当计时器调用 toggleTorch 方法时,它将 true 的值作为参数传递,即使我已经专门传递了 false 到计时器作为 userInfo 参数。

所以我挠头想“啊”让我们尝试在选择器/方法参数中使用默认值 false 并在计时器 中传递 nil userInfo 参数。这样我就可以依赖每次调用的 false 默认值。所以我的新选择器签名如下所示:-

func toggleTorch(adjustingBrightness: Bool = false) -> Bool

现在调用它的计时器已更改为:-

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self.torch, selector: "toggleTorch:", userInfo: nil, repeats: true)

然而,尽管有默认参数并且没有参数通过计时器传递,传递的值仍然是 true。因此,我进行了更多修改,并决定看看使用我的 ViewController 作为目标对象是否会有所作为。我像这样在我的 ViewController 中放置了一个新的选择器:-

func toggleTorch() {
torch.toggleTorch(false)
}

然后我更新我的计时器以在 ViewController 中调用这个新方法:-

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "toggleTorch", userInfo: nil, repeats: true)

'Hey Presto' 它现在工作正常并且正在传递正确的 bool 值 false 因为我自己传递了该值。为什么会这样?有关信息,我已经学习 Swift 大约三个星期了,所以我不是专家

最佳答案

NSTimer没有通过 userInfo信息作为选择器的参数。它将自身作为参数传递,以便您知道调用了哪个计时器。

你应该设置如下:

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self.torch, selector: "strobeTimerFired:", userInfo: nil, repeats: true)

在你的 Torch 对象中有一个方法如下:

func strobeTimerFired(timer: NSTimer) {
toggleTorch(false)
}

在这种情况下,您不需要访问 strobeTimerFired 中的计时器对象方法,但最好还是包含它(可以跳过)。例如,您可以添加额外的检查以确保触发该方法的计时器符合您的预期。

如果您确实需要使用 userInfo对于某些东西,(在这种情况下不要认为你需要它),你可以在原始 scheduledTimerWithTimeInterval 中传递一个对象称为 userInfo参数,然后您将在 strobeTimerFired 中访问它通过访问方法:timer.userInfo .

关于ios - Swift - NSTimer 为 userInfo 参数传递了错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34559331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com