UIPageViewController在哪里实现setViewControllers(.. :)方法

问题描述 投票:0回答:1

因此,我有一个UIPageViewController,如果设备处于横向模式,我想将spineLocation实现为.mid,以纵向实现.min,因此在横向模式中显示两个控制器,在纵向模式中显示一个控制器。

在页面视图控制器委托中,我实现了此功能:

func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
    if orientation == .landscapeLeft || orientation == .landscapeRight {
        return .mid
    } else {
        return .min
    }
}

在我的UIPageViewController类中,要设置视图控制器,我具有此功能:

func setControllers() {
    var controllers: [UIViewController] = [controller1]
    if spineLocation == .mid {
        controllers.append(controller2)
    }
    setViewControllers(controllers, direction: .forward, animated: true, completion: nil)
}

我的问题是我不确定放在哪里,我尝试过:

  1. viewDidLoad(设置pageController委托之前)
  2. viewDidLoad(设置pageController委托后)
  3. viewWillTransition(大小:CGSize,带协调器:UIViewControllerTransitionCoordinator)
  4. didRotate(from fromInterfaceOrientation:UIInterfaceOrientation)
  5. willRotate(to toInterfaceOrientation:UIInterfaceOrientation,持续时间:TimeInterval)

视图以纵向模式正确显示,但是当我启动或将设备横向移动时,应用程序崩溃的原因是:

***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'所提供的视图控制器的数量(1)与请求的主干位置(UIPageViewControllerSpineLocationMid)所需的数量(2)不匹配'


swift uiinterfaceorientation uipagecontrol
1个回答
0
投票

我通过以下方式修复了它:将spineLocation添加为函数setControllers的参数:

func setControllers(forSpineLocation location: SpineLocation) {
var controllers: [UIViewController] = [controller1]
if location == .mid {
    controllers.append(controller2)
}
setViewControllers(controllers, direction: .forward, animated: true, completion: nil)

}

并且通过在viewDidLoad和pageViewController(_ pageViewController:UIPageViewController,spineLocationFor direction:UIInterfaceOrientation)上实现它:

override func viewDidLoad() {
    super.viewDidLoad()
    setControllers(withLocation: spineLocation)
}

func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
    var location = SpineLocation.min
    if orientation == .landscapeLeft || orientation == .landscapeRight {
        location = .mid
    }
    setControllers(withLocation: location)
    return location
}

我不知道这是正确的还是最好的方法,但是它可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.