草庐IT

ios - 以编程方式推进 UIPageViewController - Swift

coder 2024-01-29 原文

这是我第一次尝试IOS应用,对swift没有经验,很多代码都是从网上借来的,自己编的。

我正在尝试创建一组幻灯片。我从主登陆页面转到另一个运行幻灯片的 View Controller TestVC。着陆页和幻灯片有效。我可以来回滑动。我现在正尝试添加一个计时器,以便幻灯片每 5 秒左右自动播放一次。

我相信需要运行的代码是:

pageViewController.setViewControllers(varPageVC, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)

我收到一个错误:

test.swift:31:9: Ambiguous reference to member 'pageViewController(_:viewControllerBefore:)'.

我不知道如何解释这个错误并继续前进。该错误在 test.swift 中触发,其中计时器调用尝试推进幻灯片的函数。建议表示赞赏。如果我做错了,请指出正确的方向。

登陆页面有一个按钮,可以打开一个 ViewController testVC。我有 2 个文件,test.swiftalphabetItemController.swift。除了着陆页 ViewController 之外, Storyboard还有一个名为 alphabetPVC 的 PageViewController、一个名为 alphabetVC 的 ViewController 和一个 ViewController 称为 TestVC。

这是 alphabetItemController.swift 的代码......

import UIKit

class alphabetItemController: UIViewController {

    @IBOutlet weak var contentImageView2: UIImageView!
    @IBOutlet weak var contentWordPn: UILabel!

    var itemIndex: Int = 0
    var imageName: String = ""
    var wordPN: String = ""

    var tTime: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()

        contentImageView2!.image = UIImage(named: imageName)
        contentWordPn!.text = wordPN

    }

}

这是 test.swift 的代码 ...

import Foundation
import UIKit

class testItemController: UIViewController, UIPageViewControllerDataSource {

    var tTime: Timer!

    override func viewDidLoad() {
        super.viewDidLoad()

        createPageViewController()
        setupPageControl()

        tTime = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(changeSlide), userInfo: nil, repeats: true)
        //tTime = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(goToNextPage), userInfo: nil, repeats: true)

    }


    func changeSlide() {
        pageViewController.setViewControllers(varPageVC, direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
    }


    // MARK: - Variables
    private var varPageVC: UIPageViewController?


    private let contentTextWordPN = ["A", "B", "C", "D", "E"]
    private let contentCount = 5 //TODO ADJUST THIS FOR EACH COLLECTION


    private func createPageViewController() {

        let pageController = self.storyboard!.instantiateViewController(withIdentifier: "alphabetPVC") as! UIPageViewController

        pageController.dataSource = self

        if contentCount > 0 {
            let firstController = getItemController(itemIndex: 0)!
            let startingViewControllers = [firstController]
            pageController.setViewControllers(startingViewControllers, direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
        }

        varPageVC = pageController
        addChildViewController(varPageVC!)
        self.view.addSubview(varPageVC!.view)
        varPageVC!.didMove(toParentViewController: self)
    }

    private func setupPageControl() {
        let appearance = UIPageControl.appearance()
        appearance.pageIndicatorTintColor = UIColor.gray
        appearance.currentPageIndicatorTintColor = UIColor.white
        appearance.backgroundColor = UIColor.darkGray
    }

    func pageViewController(_ varPageVC: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

        let itemController = viewController as! alphabetItemController

        if itemController.itemIndex > 0 {
            return getItemController(itemIndex: itemController.itemIndex-1)
        }

        return nil
    }

    func pageViewController(_ varPageVC: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

        let itemController = viewController as! alphabetItemController

        if itemController.itemIndex+1 < contentCount {
            return getItemController(itemIndex: itemController.itemIndex+1)
        }

        return nil
    }

    private func getItemController(itemIndex: Int) -> alphabetItemController? {

        if itemIndex < contentCount {
            let pageItemController = self.storyboard!.instantiateViewController(withIdentifier: "alphabetVC") as! alphabetItemController

            pageItemController.itemIndex = itemIndex
            pageItemController.imageName = "alphabet_" + String(format: "%02d", (itemIndex + 1)) //alphabet_01

            pageItemController.wordPN = contentTextWordPN[itemIndex]


            return pageItemController
        }

        return nil
    }

    func presentationCountForPageViewController(varPageVC: UIPageViewController) -> Int {
        return contentCount
    }

    func presentationIndexForPageViewController(varPageVC: UIPageViewController) -> Int {
        return 0
    }

    func currentControllerIndex() -> Int {

        let pageItemController = self.currentController()

        if let controller = pageItemController as? alphabetItemController {
            return controller.itemIndex
        }

        return -1
    }

    func currentController() -> UIViewController? {

        if (self.varPageVC?.viewControllers?.count)! > 0 {
            return self.varPageVC?.viewControllers![0]
        }

        return nil
    }

}

extension UIPageViewController {

    func goToNextPage(animated: Bool = true) {
        guard let currentViewController = self.viewControllers?.first else { return }
        guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) else { return }
        setViewControllers([nextViewController], direction: .forward, animated: animated, completion: nil)
    }

    func goToPreviousPage(animated: Bool = true) {
        guard let currentViewController = self.viewControllers?.first else { return }
        guard let previousViewController = dataSource?.pageViewController(self, viewControllerBefore: currentViewController) else { return }
        setViewControllers([previousViewController], direction: .reverse, animated: animated, completion: nil)
    }

}

甚至还有一个扩展UIPageViewController,但我不知道如何调用goToNextPage函数。

最佳答案

我最终更改了 changeSlide() 函数...我已经在扩展中有了下一个幻灯片函数,但我不知道调用它的语法...我找到了一些示例在 SO 上并将它们用作引用:

func changeSlide() {
    varPageVC?.goToNextPage()
}

关于ios - 以编程方式推进 UIPageViewController - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45992734/

有关ios - 以编程方式推进 UIPageViewController - Swift的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  10. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

随机推荐