2016-04-26 42 views
0

我最近設置了一個ContainerView,它帶有一個PageViewController,這個PageViewController作爲我擁有的TableView頂部的一種橫幅瀏覽視圖(圖像)。現在,我很難將它連接到NSTimer(這樣它會自動循環瀏覽視圖/圖像)。除了我試圖連接的計時器部分之外,一切正常。我試圖轉換一些Objective-C教程/ SO問題,但仍然有困難。在Swift中使用PageViewController設置NSTimer

我已經看過這個:Set timer to UIPageViewController,但我無法得到所提供的代碼爲我工作(或它的任何變化)。

請參閱以下我的代碼:

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] 
    } 

} 

任何幫助是極大的讚賞。

+0

的http://stackoverflow.com/questions/29358685/set-timer-to-uipageviewcontroller – fuzz

+0

可能重複我hadn」看到那一個。我正在審查。謝謝! (如果是這樣,我會刪除它) – skind

+0

@gotnull我可能只是一個白癡,但我無法讓我的代碼工作。 – skind

回答

1

有兩點要注意:

1)總的想法是,你需要設置一個計時器在一些合理place-- viewWillAppear是一種常見的位置,記得要使它無效當視圖不再顯示(如viewWillDisappear)。如果不這樣做,可能會導致內存增長,因爲運行循環對目標有強烈的參考 - 在本例中爲self。我建議將您的NSTimer.scheduledTimer...調用移動到viewWillAppear

2)上面的代碼animation非常簡單。基本上,你需要獲得當前的「頁面」,找出下一個「頁面」應該是什麼,然後讓你的UIPageViewController顯示下一個「頁面」。

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) 
} 

你也可以簡化您的beforeafter方法略有:

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

這個作品絕對完美。沒有意識到它是多麼的容易,但是現在看着你的代碼是完全合理的。謝謝。另外,感謝VCAfterVC/Before代碼的簡化。 – skind

+0

很高興工作!請注意我關於在VC生命週期中使定時器失效的評論。現在養成這種習慣,將會爲你節省很多的痛苦。 :) – Palpatim

+0

我注意到,並且實際上添加了一些代碼來使其無效。起初,我沒有(只是爲了測試你的代碼),並很快看到它是如何隨着我移開並回到它而與視圖混雜在一起的。偉大的建議和感謝的領導。 – skind