所以这就是人类逻辑中发生的事情(但不是假设)。
目标:在我的UIImageView中显示图像5秒左右,然后在线显示下一个图像(imageArray)。
是我的计时器导致功能暂停,还是与我的代码安排有关?所有建议/帮助都非常感谢,因为这是一个非常令人沮丧的问题。
这是Swift语言,但我可以阅读Objective-C。
这是我的课程代码:
//
// ImageDisplayViewController.swift
//
//
// Created by on 5/3/15.
//
//
import Cocoa
import ParseOSX
class ImageDisplayViewController: NSViewController {
@IBOutlet weak var imageView: NSImageView!
var venue: String!
var imageArray = [(Int, NSImage)]()
var image: NSImage!
var timeToDisplay: Int = 0
var timer = NSTimer()
override func viewDidLoad() {
super.viewDidLoad()
venue = "Bees"
loadImages()
}
var k: Int = 0
func presentNextImage() {
if(k<imageArray.count) {
imageView.image = imageArray[k].1
timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("presentNextImage"), userInfo: nil, repeats: false)
println(timer.timeInterval)
//imageView.image = imageArray[k].1
println("k is \(k)")
k++
println("Just set a new imageView.image")
} else {
println("K is n longer <imageArray.count")
}
}
func loadImages() {
var query = PFQuery(className:groupz)
query.whereKeyExists("imageFile")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]?, error: NSError?) -> Void in
if error == nil {
println("Successfully retrieved \(objects!.count) objects.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
let thumbNail = object["imageFile"] as! PFFile
self.image = NSImage(data: thumbNail.getData()!)
let time: AnyObject? = object["displayTime"]
self.timeToDisplay = time!.integerValue
let tempTuple = (self.timeToDisplay, self.image!)
self.imageArray.append(tempTuple)
}
}
println("imageArray.count is: \(self.imageArray.count)")
self.presentNextImage()
} else {
// Log details of the failure
println("Error: \(error!) \(error!.userInfo!)")
}
}
}
}
答案 0 :(得分:2)
将您的NSTimer
声明为weak
。来自NSTimer
上的Apple docs:
特别注意,run循环保持对它们的强引用 定时器,所以你不必保持自己强烈的参考 将它添加到运行循环后的计时器。
此外,您实际上不需要维护对计时器的引用,因为您没有在选择器参数中调用的方法之外调用invalidate
,在您的情况下,恰好是方法分配计时器。
在您的情况下,保持对计时器的弱引用并使其无效以将其从viewWillDisappear:
中的运行循环中删除。
答案 1 :(得分:0)
我发现了问题。出于某种原因,将我的视图控制器(显示图像的控制器)显示为Modal
会导致计时器无法运行或可能被添加到NSRunLoop。我对此并不十分肯定。但是一旦我将Segue改为Show
我的计时器开始正常工作。
感谢Nikita的帮助,我从你的问题答案中学到了很多东西。