2016-03-08 68 views
0

好吧,所以我试图通过创建一个类来存储数组UIImages,并且有一个函数可以从数组中选择一个随机索引,并创建一个“幻灯片放映”然后分配副图像图像视图中ViewController.h延迟更改UIImageView.image

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 


var audioPlayer = AVAudioPlayer() 
var audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("1-08 Patient Love", ofType: "mp3")!) 
var playPauseBtn = UIBarButtonItem() 
var musicPaused: Bool = false 

@IBOutlet var toolbar: UIToolbar! 
@IBOutlet var bg1: UIImageView! 
@IBOutlet var bg2: UIImageView! 
@IBOutlet var bg3: UIImageView! 
@IBOutlet var bg4: UIImageView! 
@IBOutlet var bg5: UIImageView! 
@IBOutlet var bg6: UIImageView! 
@IBOutlet var bg7: UIImageView! 
@IBOutlet var bg8: UIImageView! 
@IBOutlet var bg9: UIImageView! 
@IBOutlet var bg10: UIImageView! 
@IBOutlet var bg11: UIImageView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    do{ 
     audioPlayer = try AVAudioPlayer(contentsOfURL: audioPath)} 
    catch { 
      print("Audio file not found.") 
     } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func playPause(sender: UIBarButtonItem){ 

    var items = toolbar.items! 

    if musicPaused == false { 

     playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Pause, target: self, action: "playPause:") 

     items[0] = playPauseBtn 

     toolbar.setItems(items, animated: true) 

     audioPlayer.play() 
     musicPaused = true 

    }else{ 

     var items = toolbar.items! 

     playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:") 
     items [0] = playPauseBtn 
     toolbar.setItems(items, animated: true) 

     audioPlayer.pause() 
     musicPaused = false 
    } 
} 

@IBAction func stopButton(sender: AnyObject) { 

    var items = toolbar.items! 
    audioPlayer.stop() 
    audioPlayer.currentTime = 0 
    playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:") 
    items[0] = playPauseBtn 
    toolbar.setItems(items, animated: true) 
    musicPaused = false 
} 
} 

这是我的看法controller.swift文件。我没有引用尚未功能我想在这里slideshow.swift文件中写入

import UIKit 

var imageArray: [UIImage] = [ 
UIImage(named: "dec11.jpg")!, 
UIImage(named: "dec18.jpg")!, 
UIImage(named: "dec19.jpg")!, 
UIImage(named: "dec19-2.jpg")!, 
UIImage(named: "dec24.jpg")!, 
UIImage(named: "dec25.jpg")!, 
UIImage(named: "dec30.jpg")!, 
UIImage(named: "jan1.jpg")!, 
UIImage(named: "jan20.jpg")!, 
UIImage(named: "jan24.jpg")!, 
UIImage(named: "jan30.jpg")! 
] 

幻灯片类是

class slideshow: NSObject { 

func changeImage() -> UIImage{ 
    //wait 2 secs 
    let seconds = 2.0 
    let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds 
    let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 

    dispatch_after(dispatchTime, dispatch_get_main_queue(), { 

     //here code perfomed with delay 
     //generate random number 
     let randomIndex = Int(arc4random_uniform(11)) 

     var imageAtIndex = imageArray[randomIndex] 

     return imageAtIndex 
    }) 
} 
} 

难道是容易只是写所有在视图控制器?我根据其他用户的建议更改了函数声明,但是我仍然收到相同的错误。

回答

1

您不能有两个变量image的声明。你有一个传递到函数:

@IBAction func changeImage (image: UIImage){ 

,另一个是你延迟行动的一部分:

//return image at index 
    var image = imageAtIndex 

你不想回图像,你要设置的图像将UIImageView的属性添加到阵列的图像中,假设您的数组包含UIImage

因此改变你的功能decalaration是

func changeImage (imageViewToChange: UIImageView){ 

然后改变dispatch_after代码是

dispatch_after(dispatchTime, dispatch_get_main_queue(), { 

    //here code performed after delay 
    //generate random number 
    let randomIndex = Int(arc4random_uniform(11)) 

    //return image at index 
    imageViewToChange.image = imageArray[randomIndex] 
}) 
+0

太棒了!这至少让我在屏幕上的图像。然后我试图在声明之后添加另一个dispatch来延迟,然后使其递归。这也没有奏效。想法呢? – ChrisHooked

+0

设置图像后,你不应该调用'changeImage()'吗?在'dispatch_after'里面,只需调用'self.changeImage(imageViewToChange)' – wottle

0

以下代码未经测试,但您应该可以执行下列操作。幻灯片类包含启动和停止方法的可能图像列表。 animate方法递归调用,所以您不必每次都从vc调用它。

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

var audioPlayer = AVAudioPlayer() 
var audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("1-08 Patient Love", ofType: "mp3")!) 
var playPauseBtn = UIBarButtonItem() 
var musicPaused: Bool = false 

@IBOutlet var toolbar: UIToolbar! 
@IBOutlet var bg: UIImageView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    do{ 
     audioPlayer = try AVAudioPlayer(contentsOfURL: audioPath)} 
    catch { 
      print("Audio file not found.") 
     } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func playPause(sender: UIBarButtonItem){ 

    var items = toolbar.items! 

    if musicPaused == false { 

     playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Pause, target: self, action: "playPause:") 

     items[0] = playPauseBtn 

     toolbar.setItems(items, animated: true) 

     audioPlayer.play() 
     musicPaused = true 
     slideshow.startSlideshow(bg) 

    }else{ 

     var items = toolbar.items! 

     playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:") 
     items [0] = playPauseBtn 
     toolbar.setItems(items, animated: true) 

     audioPlayer.pause() 
     slideshow.stopSlideshow() 
     musicPaused = false 
    } 
} 

@IBAction func stopButton(sender: AnyObject) { 

    var items = toolbar.items! 
    audioPlayer.stop() 
    audioPlayer.currentTime = 0 
    playPauseBtn = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Play, target: self, action: "playPause:") 
    items[0] = playPauseBtn 
    toolbar.setItems(items, animated: true) 
    musicPaused = false 
    slideshow.stopSlideshow() 
} 
} 


class slideshow: NSObject { 

var imageArray: [UIImage] = [ 
UIImage(named: "dec11.jpg")!, 
UIImage(named: "dec18.jpg")!, 
UIImage(named: "dec19.jpg")!, 
UIImage(named: "dec19-2.jpg")!, 
UIImage(named: "dec24.jpg")!, 
UIImage(named: "dec25.jpg")!, 
UIImage(named: "dec30.jpg")!, 
UIImage(named: "jan1.jpg")!, 
UIImage(named: "jan20.jpg")!, 
UIImage(named: "jan24.jpg")!, 
UIImage(named: "jan30.jpg")! 
] 
var shouldAnimate: boolean? 

func startSlideshow(imageView: UIImageView) { 
    shouldAnimate = true 
    self.animate() 
} 

func stopSlideshow() { 
    shouldAnimate = false 
} 

func animate() { 
     //wait 2 secs 
    let seconds = 2.0 
    let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds 
    let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 

    dispatch_after(dispatchTime, dispatch_get_main_queue(), { 

     //here code perfomed with delay 
     //generate random number 
     let randomIndex = Int(arc4random_uniform(11)) 

     var imageAtIndex = imageArray[randomIndex] 

     imageView.image = imageAtIndex 
     if (shouldAnimate) { 
      self.animate() 
     } 
    }) 
    } 
} 
+0

我改变了我的函数来匹配这个声明,但我仍然得到同样的错误。也许这是我声明数组的方式。 – ChrisHooked

+0

不,changeImage应该在X秒延迟后更改显示的图像。他的错误是他有两个变量图像的声明。一个作为参数,另一个作用于函数。 – wottle

+0

如果你想要做的事情是正确的,那么你需要访问图像视图来设置图像等于。但是也许你可以更新你的方法,也许可以显示调用它的代码给我们更多的上下文。 – Steve