2016-03-08 3 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

Удивительный! Это, по крайней мере, показало мне изображение на экране. Затем я попытался добавить еще одну отправку после утверждения для задержки, а затем сделать ее рекурсивной. Это тоже не сработало. Идеи по этому поводу? – 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

Если wottle правильно в том, что вы пытаетесь сделать, вам потребуется доступ к представлению изображения, чтобы установить равное изображение. Но, возможно, вы можете обновить свой метод и, возможно, показать код, который вызывает его, чтобы дать нам больше контекста. – Steve

Смежные вопросы