ios - PageViewController 在使用 segue 按下按钮后禁用 - Swift 4
问题描述
我成功实现了一个 PageViewController,我可以在其中滑动五个页面(ViewControllers)。问题是当我添加一个连接到其中一个 ViewController 的按钮时。它显示了页面,就像它应该的那样,但是我被困在那个页面上。PageViewController 不再起作用。我不能再在页面之间滑动。
import UIKit
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
lazy var subViewControllers:[UIViewController] = {
return [
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController1") as! ViewController1,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as! ViewController2,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController3") as! ViewController3,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController4") as! ViewController4,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController5") as! ViewController5,
]
}()
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
self.dataSource = self
setViewControllers([subViewControllers[0]], direction: .forward, animated: true, completion: nil)
}
// MARK - UIPageViewControllerDataSource
func presentationCount(for pageViewController: UIPageViewController) -> Int {
return subViewControllers.count
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let currentIndex:Int = subViewControllers.index(of: viewController) ?? 0
if(currentIndex <= 0) {
return nil
}
return subViewControllers[currentIndex-1]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let currentIndex:Int = subViewControllers.index(of: viewController) ?? 0
if(currentIndex >= subViewControllers.count-1) {
return nil
}
return subViewControllers[currentIndex+1]
}
}
解决方案
您可以将您的引用传递PageViewController
给您的子视图控制器,以便您可以PageViewController
从子视图控制器调用您的方法。例如,创建
var pageViewController : PageViewController?
ViewController4
然后将其分配在subViewControllers
lazy var subViewControllers:[UIViewController] = {
let viewController4 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController4") as! ViewController4
viewController4.pageViewController = self
return [
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController1") as! ViewController1,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController2") as! ViewController2,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController3") as! ViewController3,
viewController4,
UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController5") as! ViewController5,
]
}()
然后,您可以调用PageViewController
from的任何方法ViewController4
。为简单起见,您可以scrollToViewController3()
在PageViewController
func scrollToViewController3()
{
setViewControllers([subViewControllers[2]], direction: .reverse, animated: true, completion: nil)
}
pageViewController?.scrollToViewController3()
并打电话ViewController4
推荐阅读
- flowtype - 在项目特定的命名导出上添加流类型注释的好习惯是什么
- haskell - 如何将 Map ByteString ByteString 转换为 Map String String 并打印
- javascript - Angular:制作材料步进器所需的按钮切换组
- vba - Sharepoint 中的 MS-Access - 有哪些可用数据?
- gitahead - Gitahead 的静默命令行安装?
- c# - WebClient 仅针对该网站返回 403 错误?
- docker-compose - Azure IoT Edge - 从模块到主机网络设备的通信
- java - 为基于 testng 的框架进行测试用例清理的最佳方法
- c# - Quartz.net Core 中的依赖注入找不到已注册的服务
- angular - Angular 8 惰性路由解析有无前缀并在父级之前重定向