UIPageViewController。如何设置自定义 UIViewControllers 数组

Posted

技术标签:

【中文标题】UIPageViewController。如何设置自定义 UIViewControllers 数组【英文标题】:UIPageViewController. How to set up the array of custom UIViewControllers 【发布时间】:2019-05-28 20:26:39 【问题描述】:

我有一组 4 个 UIViewController,都有自己的自定义类,并且我设置了委托。到目前为止,我的主视图中有容器视图,这些视图被滚动到屏幕外,这就是我正在做一个“伪页面视图控制器”的方式。但是,为了培训,我想使用 UIPageViewController 将其转换为实际的页面视图控制器。 我看过一堆教程,但大多数人只使用一个视图控制器并更改其中的文本以显示多个。就我而言,我有 4 个自定义视图控制器:

var glanceController: GlanceVC!
var goalsController: GoalsVC!
var commuteController: CommuteVC!
var compareController: CompareVC!

在我之前的伪页面视图控制器上,我这样初始化它们:

func loadVC() 
    glanceController = self.storyboard?.instantiateViewController(withIdentifier: "sbGlance") as? GlanceVC
    goalsController = self.storyboard?.instantiateViewController(withIdentifier: "sbGoals") as? GoalsVC
    commuteController = self.storyboard?.instantiateViewController(withIdentifier: "sbCommute") as? CommuteVC
    compareController = self.storyboard?.instantiateViewController(withIdentifier: "sbCompare") as? CompareVC

现在据我了解,UIPageViewController 需要一组 UIViewController。但是我不能创建这个数组:

var VCArray: [UIViewController] = [glanceController, goalsController, commuteController, compareController]

错误:无法在属性初始化程序中使用实例成员“glancecontrolleer”。

我尝试改为声明一个空白数组 var VCArray: [UIViewcontroller] = [] 然后在

之后添加
func loadVC() 
    glanceController = self.storyboard?.instantiateViewController(withIdentifier: "sbGlance") as? GlanceVC
    goalsController = self.storyboard?.instantiateViewController(withIdentifier: "sbGoals") as? GoalsVC
    commuteController = self.storyboard?.instantiateViewController(withIdentifier: "sbCommute") as? CommuteVC
    compareController = self.storyboard?.instantiateViewController(withIdentifier: "sbCompare") as? CompareVC
    VCArray += glanceController

但是,这也有一个错误:“Argument Type @value glanceVC? 不符合预期的类型“Sequence”。

有人可以帮我为我的 uipageview 制作这个自定义视图控制器数组吗?

【问题讨论】:

【参考方案1】:

创建一个计算属性并返回视图控制器数组

var VCArray: [UIViewController] 
    if let glanceController = self.storyboard?.instantiateViewController(withIdentifier: "sbGlance") as? GlanceVC,
        let goalsController = self.storyboard?.instantiateViewController(withIdentifier: "sbGoals") as? GoalsVC,
        let commuteController = self.storyboard?.instantiateViewController(withIdentifier: "sbCommute") as? CommuteVC,
        let compareController = self.storyboard?.instantiateViewController(withIdentifier: "sbCompare") as? CompareVC 
            return [glanceController, goalsController, commuteController, compareController]
    
    return []

【讨论】:

嗨,谢谢,它不会触发任何错误。但是它根本没有运行。我在 return 命令之前添加了一个 "print("TESTTEST" 并且它似乎没有运行它,所以我假设 if 语句是错误的。 @dvd.Void 视图控制器在此行返回return [glanceController, goalsController, commuteController, compareController] 在此行之前尝试打印或使用断点

以上是关于UIPageViewController。如何设置自定义 UIViewControllers 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Xcode 中快速设置 UIPageViewController 的过渡样式?

故事板:如何使用故事板为 UIPageViewController 设置初始视图控制器?

如何在XIB(Interface Builder)中使用UIPageViewController的子类来设置DataSource、Delegate和TransitionStyle

UIPageViewController - 如何在横向模式下自定义左右页面?

UIPageViewController 如何访问不可见页面

如何在 UIPageViewController 和孩子之间正确传递对象