ios - 在 Swift 中使用 PageViewController 设置 NSTimer

标签 ios xcode swift uipageviewcontroller

我最近设置了一个 ContainerView 和一个 PageViewController,它在 View (图像)之间循环,作为 TableView 顶部的一种横幅我有。现在,我很难将其连接到 NSTimer(以便它自动循环浏览 View /图像)。一切正常,除了我试图连接的计时器部分。我尝试转换一些 Objective-C 教程/SO 问题,但仍然遇到困难。

我看过这个: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]
    }

}

非常感谢任何帮助。

最佳答案

一些注意事项:

1) 大意是你需要在一些合理的地方设置一个定时器--viewWillAppear 是一个常见的位置,并且记得让它失效 View 不再显示(如 viewWillDisappear)。否则可能会导致内存增长,因为运行循环持有对目标的强引用——在本例中为 self。我建议将您的 NSTimer.scheduledTimer... 调用移动到 viewWillAppear

2) 上面的动画代码非常简单。基本上,您需要获取当前“页面”,找出下一个“页面”应该是什么,然后让您的 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]
}

关于ios - 在 Swift 中使用 PageViewController 设置 NSTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36855427/

相关文章:

swift - 如何在集合扩展中返回空子序列

android - 可以在 Appcelerator 中像这样使用 scrollabeView 吗?

ios - 如何在 TableView 中使用 TableViewController 类?

ios - 从 Swift 访问 Unity 值

php - 从 OS X 将视频直接上传到 YouTube

ios - 如何在 swift 中将快速更新的字符串附加到文件中

ios - 警报每次都会打开,而不仅仅是第一次

iOS 分享扩展如何支持 *.wav 文件

ios - 以编程方式添加前导/顶部约束

objective-c - xcodebuild 使用与从 Xcode 内部构建不同的配置