2016-04-26 80 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

相关问题