2016-04-26 11 views
0

Ich habe vor kurzem eine ContainerView mit einer PageViewController eingerichtet, die durch Ansichten (Bilder) als eine Art Banner über eine TableView, die ich habe, zykliert. Jetzt habe ich Schwierigkeiten, das an eine NSTimer anzuhängen (so dass es automatisch durch die Ansichten/Bilder läuft). Alles funktioniert, außer dem Timer-Teil, den ich versucht habe zu verbinden. Ich habe versucht, einige Objective-C Tutorials/SO Fragen zu konvertieren, habe aber immer noch Schwierigkeiten.Einrichten von NSTimer mit PageViewController in Swift

Ich habe mir Folgendes angeschaut: Set timer to UIPageViewController, aber ich kann den bereitgestellten Code überhaupt nicht für mich arbeiten (noch irgendeine Variante davon).

Siehe unten für meinen Code:

class ImageSwapViewController: UIPageViewController { 

    private(set) lazy var orderedViewControllers: [UIViewController] = { 
     return [self.newColoredViewController("First"), 
     self.newColoredViewController("Second"), 
     self.newColoredViewController("Third")] 
    }() 

    private func newColoredViewController(order: String) -> UIViewController { 
     return UIStoryboard(name: "Main", bundle: nil) . 
     instantiateViewControllerWithIdentifier("\(order)ViewController") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     self.dataSource = self 

     if let firstViewController = orderedViewControllers.first { 
     setViewControllers([firstViewController], 
      direction: .Forward, 
      animated: true, 
      completion: nil) 
    } 

     NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: #selector(ImageSwapViewController.animation), userInfo: nil, repeats: true) 
    } 

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

    func animation() { 
     [NEED HELP WITH WHAT GOES HERE] 
    } 
} 

extension ImageSwapViewController : UIPageViewControllerDataSource { 

    func pageViewController(pageViewController: UIPageViewController, 
     viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
      guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else { 
       return nil 
      } 

      let previousIndex = viewControllerIndex - 1 

      guard previousIndex >= 0 else { 
       return orderedViewControllers.last 
      } 

      guard orderedViewControllers.count > previousIndex else { 
       return nil 
      } 

      return orderedViewControllers[previousIndex] 
    } 

    func pageViewController(pageViewController: UIPageViewController, 
     viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
      guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else { 
       return nil 
      } 

      let nextIndex = viewControllerIndex + 1 
      let orderedViewControllersCount = orderedViewControllers.count 

      guard orderedViewControllersCount != nextIndex else { 
       return orderedViewControllers.first 
      } 

      guard orderedViewControllersCount > nextIndex else { 
       return nil 
      } 

      return orderedViewControllers[nextIndex] 
    } 

} 

Jede Hilfe wird sehr geschätzt.

+0

Mögliche Duplikat http://stackoverflow.com/questions/29358685/set-timer-to-uipageviewcontroller – fuzz

+0

I hadn‘ Ich habe das gesehen. Ich überprüfe jetzt. Vielen Dank! (Ich werde das löschen, wenn es so ist) – skind

+0

@gotnull Ich bin wahrscheinlich nur ein Idiot, aber ich habe Probleme, diese Antwort mit meinem Code zu arbeiten. – skind

Antwort

1

Ein paar Anmerkungen:

1) Die allgemeine Idee ist, dass Sie einen Timer in einer vernünftigen place-- viewWillAppear einrichten müssen eine gemeinsame Position ist, und merken es ungültig zu machen, wenn die Ansicht ist nicht mehr angezeigt (wie in viewWillDisappear). Anderenfalls kann es zu Speichererweiterungen kommen, da die Laufschleife eine starke Referenz auf das Ziel hat - in diesem Fall self. Ich würde empfehlen, den Aufruf NSTimer.scheduledTimer... auf viewWillAppear zu verschieben.

2) Der obige Code animation ist ziemlich einfach. Im Grunde müssen Sie die aktuelle "Seite" holen, herausfinden, was die nächste "Seite" sein soll, und dann Ihren UIPageViewController bitten, die nächste "Seite" anzuzeigen.

func animation() { 
    guard let currentViewController = viewControllers?.first else { 
     return 
    } 

    // Use delegate method to retrieve the next view controller 
    guard let nextViewController = pageViewController(self, viewControllerAfterViewController: currentViewController) else { 
     return 
    } 
    setViewControllers([nextViewController], direction: .Forward, animated: true, completion: nil) 
} 

Sie könnten auch leicht Ihre before und after Methoden vereinfachen:

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
    guard let i = orderedViewControllers.indexOf(viewController) else { 
     return nil 
    } 
    let nextIndex = (i + 1) % AutoAnimatingPageViewController.colors.count 
    return orderedViewControllers[nextIndex] 
} 

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    guard let i = orderedViewControllers.indexOf(viewController) else { 
     return nil 
    } 
    let prevIndex = (i - 1) < 0 ? AutoAnimatingPageViewController.colors.count - 1 : (i - 1) 
    return orderedViewControllers[prevIndex] 
} 
+0

Das funktioniert absolut perfekt. Hab nicht gemerkt, wie einfach das war, aber jetzt, wenn du über deinen Code nachdenkst, macht es einen Sinn. Vielen Dank. Danke auch für die Vereinfachung des VCAfterVC/Before-Codes. – skind

+0

Froh, es hat funktioniert! Bitte beachten Sie auch meinen Kommentar zum Ungültigmachen des Timers während des VC-Lebenszyklus. Diese Gewohnheit jetzt zu entwickeln, wird dir in der Zukunft viel Leid ersparen. :) – Palpatim

+0

Ich habe das bemerkt und tatsächlich Code hinzugefügt, um es ungültig zu machen. Anfangs habe ich nicht (nur um deinen Code zu testen) und habe schnell gesehen, wie es mit der Ansicht verschraubt war, als ich mich davon wegbewegte. Toller Rat und danke für die Köpfe. – skind

Verwandte Themen