Bilder mit Timer wechseln lassen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bilder mit Timer wechseln lassen

    Hallo zusammen,

    ich verzweifle an meiner Aufgabe. Ich versuche in einem NSImageView zwei Bilder, die vorher vom User eingefügt worden sind, mit der Klasse NSTimer wechseln zu lassen. Hierfür habe ich einen Button erstellt der den Timer startet und wieder beendet. Nur wird leider der Timer nicht gestartet ;(
    Vielleicht kann mir jemand ein Tipp geben was ich hier eventuell vergessen habe oder falsch mache. Ich habe schon viele Varianten versucht aber komme gerade nicht weiter.

    Vielen Dank schon einmal.


    Quellcode

    1. import Cocoa
    2. class ViewController: NSViewController {
    3. var timerBild: Timer!
    4. var meinBild1: NSImage!
    5. var meinBild2: NSImage!
    6. func meldungHinzugefuegt() {
    7. let meldungHinzugefuegt: NSAlert = NSAlert()
    8. meldungHinzugefuegt.messageText = "Information"
    9. meldungHinzugefuegt.informativeText = "Das Bild \(bildName.stringValue) wurde eingefügt!"
    10. meldungHinzugefuegt.runModal()
    11. }
    12. func fehlerMeldung() {
    13. let meineMeldung: NSAlert = NSAlert()
    14. meineMeldung.messageText = "Fehler"
    15. meineMeldung.informativeText = "Die Grafik konnte nicht geladen werden. Bitte prüfen Sie Ihre Eingabe."
    16. meineMeldung.runModal()
    17. }
    18. @IBAction func beenden(_ sender: Any) {
    19. NSApplication.shared.terminate(self)
    20. }
    21. @IBOutlet weak var bildAnzeige: NSImageView!
    22. @IBOutlet weak var bildName: NSTextField!
    23. @IBAction func meinDialog(_ sender: Any) {
    24. let meinDialog: NSOpenPanel = NSOpenPanel()
    25. meinDialog.prompt = "Bild 1 hinzufügen"
    26. meinDialog.allowedFileTypes = NSImage.imageTypes
    27. if meinDialog.runModal() == NSApplication.ModalResponse.OK {
    28. let meineDatei1 = meinDialog.url?.path
    29. bildName.stringValue = meineDatei1!
    30. meldungHinzugefuegt()
    31. bild1Anzeigen()
    32. meinDialog.prompt = "Bild 2 hinzufügen"
    33. meinDialog.allowedFileTypes = NSImage.imageTypes
    34. if meinDialog.runModal() == NSApplication.ModalResponse.OK {
    35. let meineDatei2 = meinDialog.url?.path
    36. bildName.stringValue = meineDatei2!
    37. meldungHinzugefuegt()
    38. bild2Anzeigen()
    39. }
    40. else {
    41. fehlerMeldung()
    42. }
    43. }
    44. }
    45. @objc func bild1Anzeigen() {
    46. if let meineDatei1 = NSImage(contentsOfFile: bildName.stringValue) {
    47. bildAnzeige.image = meineDatei1
    48. meinBild1 = meineDatei1
    49. }
    50. }
    51. @objc func bild2Anzeigen() {
    52. if let meineDatei2 = NSImage(contentsOfFile: bildName.stringValue) {
    53. bildAnzeige.image = meineDatei2
    54. meinBild2 = meineDatei2
    55. }
    56. }
    57. @IBAction func startTimer(_ sender: Any) {
    58. if bildAnzeige != nil {
    59. timerBild = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(bild1Anzeigen), userInfo: nil, repeats: true)
    60. timerBild = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(bild2Anzeigen), userInfo: nil, repeats: true)
    61. }
    62. }
    63. @IBAction func stopTimer(_ sender: Any) {
    64. if timerBild != nil {
    65. timerBild.invalidate()
    66. }
    67. else {
    68. return
    69. }
    70. }
    71. override func viewDidLoad() {
    72. super.viewDidLoad()
    73. // Do any additional setup after loading the view.
    74. }
    75. override var representedObject: Any? {
    76. didSet {
    77. // Update the view, if already loaded.
    78. }
    79. }
    80. }
    Alles anzeigen
  • Ok das habe ich gemacht, ich habe den zweiten mal auskommentiert, allerdings startet das immer noch nicht. Es bleibt Bild 2 in der Ansicht drin :(
    Ich habe es jetzt so angepasst.

    Also ich verstehe das so. Wenn in meiner ImageView etwas drin ist soll der Timer das Bild 1, 5 Sekunden lang anzeigen. Stehe ich auf dem Schlauch ?

    Quellcode

    1. @IBAction func startTimer(_ sender: Any) {
    2. if bildAnzeige.image != nil {
    3. timerBild = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(bild1Anzeigen), userInfo: nil, repeats: true)
    4. // Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(bild2Anzeigen), userInfo: nil, repeats: true)
    5. }
    6. else {
    7. return
    8. }
    9. }
  • Juhu, jetzt habe ich ihn zumindest einmal gestartet bekommen. :D

    Ich habe es wie folgt angepasst:


    Quellcode

    1. @IBAction func startTimer(_ sender: Any) {
    2. bildAnzeige.image = meinBild1
    3. if bildAnzeige.image != nil {
    4. timerBild = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(bild2Anzeigen), userInfo: nil, repeats: false)
    5. }
    6. else {
    7. return
    8. }
    9. }
    Allerdings musste ich erst einstellen das bildAnzeige = das Bild 1 ist, dann nach 5 Sek kommt Bild 2.

    Welche Methode müsste ich jetzt erstellen das es sich immer wiederholt bis jemand den Button "Stop" drückt?

    Eventuell mit eine For Schleife oder geht das auch mit If?
  • Du kannst in dem Selector vom Timer ja prüfen, welches Bild aktuell angezeigt wird und dann das andere anzeigen.

    Dies sollte etwa so aussehen:

    Quellcode

    1. @objc func bildWechseln() {
    2. if bildAnzeige.image == meinBild1
    3. bildAnzeige.image = meinBild2
    4. else
    5. bildAnzeige.image = meinBild1
    6. }
    Die Bilder müssen natürlich vorab schon geladen sein. ;)

    Bei dem Timer muss repeats: dann auch auf true stehen, damit der Selektor wiederholt aufgerufen wird.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MCDan ()