UIPageViewController 实现 - 更改视图控制器后黑屏
UIPageViewController Implementation - Black Screen After Changing View Controllers
尝试成功实现允许用户使用 UIPageViewController 在 UIViewControllers
之间滚动的应用。
目前,滑动到第二个UIViewController
后,屏幕变黑,无法再滚动。有什么想法吗?
这是我的子类 UIPageViewController 代码:
class ApplicationViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var registrationController : UIViewController!
var loginController : UIViewController!
var captureController : UIViewController!
var visibleVCS = [UIViewController]()
var index = 0
override func viewDidLoad() {
super.viewDidLoad()
initControllers()
reset()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func initControllers()
{
registrationController = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewController") as UIViewController
loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as UIViewController
captureController = self.storyboard?.instantiateViewControllerWithIdentifier("CaptureViewController") as UIViewController
visibleVCS = [registrationController, loginController, captureController]
}
func reset() {
var currentController = viewControllerAtIndex(index)
pageViewController.dataSource = self
self.setViewControllers([currentController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
if(index >= visibleVCS.count - 1){
return nil
}
return self.viewControllerAtIndex(++index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
if(index <= 0){
return nil
}
return self.viewControllerAtIndex(--index)
}
func viewControllerAtIndex(index : Int) -> UIViewController? {
return visibleVCS[index];
}
}
在 UIPageViewController 中将索引保存为 属性 对我也不起作用。为了解决这个问题,我必须创建一个索引为 属性 的基础 UIViewController,如下所示:
class PageItemController: UIViewController {
var index = -1
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
然后让你的所有页面成为 PageItemController 的子类,并根据它们在数组中的位置设置它们的索引
func initControllers(){
registrationController = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewController") as PageItemController
registrationController.index = 0
loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as PageItemController
loginController.index = 1
captureController = self.storyboard?.instantiateViewControllerWithIdentifier("CaptureViewController") as PageItemController
captureController.index = 2
// visibleVCS type must be [PageItemCotroller]
visibleVCS = [registrationController, loginController, captureController]
}
最后根据currentController索引实现before和after方法
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
if itemController.index > 0 {
return visibleVCS[itemController.index - 1]
}
return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
if itemController.index < visibleVCS.count - 1 {
return visibleVCS[itemController.index + 1]
}
return nil
}
@Zellb 的回答确实解决了这个问题。然而,这是我最终使用的代码,我发现它更易于管理:
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController(viewController)!
if (index != -1)
{
index++
if (index >= visibleVCS.count)
{
return nil
}
else
{
return visibleVCS[index]
}
}
return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController(viewController)!
if (index != -1)
{
index--
if (index < 0)
{
return nil
}
else
{
return visibleVCS[index]
}
}
return nil
}
func indexOfViewController(viewController : UIViewController) -> Int?
{
for (var i = 0; i <= visibleVCS.count; i++)
{
if (viewController == visibleVCS[i])
{
return i
}
}
return -1
}
在我的原始代码中,visibleVC 只是一个 UIViewController 数组。
尝试成功实现允许用户使用 UIPageViewController 在 UIViewControllers
之间滚动的应用。
目前,滑动到第二个UIViewController
后,屏幕变黑,无法再滚动。有什么想法吗?
这是我的子类 UIPageViewController 代码:
class ApplicationViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var registrationController : UIViewController!
var loginController : UIViewController!
var captureController : UIViewController!
var visibleVCS = [UIViewController]()
var index = 0
override func viewDidLoad() {
super.viewDidLoad()
initControllers()
reset()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func initControllers()
{
registrationController = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewController") as UIViewController
loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as UIViewController
captureController = self.storyboard?.instantiateViewControllerWithIdentifier("CaptureViewController") as UIViewController
visibleVCS = [registrationController, loginController, captureController]
}
func reset() {
var currentController = viewControllerAtIndex(index)
pageViewController.dataSource = self
self.setViewControllers([currentController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
if(index >= visibleVCS.count - 1){
return nil
}
return self.viewControllerAtIndex(++index)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
if(index <= 0){
return nil
}
return self.viewControllerAtIndex(--index)
}
func viewControllerAtIndex(index : Int) -> UIViewController? {
return visibleVCS[index];
}
}
在 UIPageViewController 中将索引保存为 属性 对我也不起作用。为了解决这个问题,我必须创建一个索引为 属性 的基础 UIViewController,如下所示:
class PageItemController: UIViewController {
var index = -1
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
然后让你的所有页面成为 PageItemController 的子类,并根据它们在数组中的位置设置它们的索引
func initControllers(){
registrationController = self.storyboard?.instantiateViewControllerWithIdentifier("RegistrationViewController") as PageItemController
registrationController.index = 0
loginController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as PageItemController
loginController.index = 1
captureController = self.storyboard?.instantiateViewControllerWithIdentifier("CaptureViewController") as PageItemController
captureController.index = 2
// visibleVCS type must be [PageItemCotroller]
visibleVCS = [registrationController, loginController, captureController]
}
最后根据currentController索引实现before和after方法
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
if itemController.index > 0 {
return visibleVCS[itemController.index - 1]
}
return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
let itemController = viewController as! PageItemController
if itemController.index < visibleVCS.count - 1 {
return visibleVCS[itemController.index + 1]
}
return nil
}
@Zellb 的回答确实解决了这个问题。然而,这是我最终使用的代码,我发现它更易于管理:
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController(viewController)!
if (index != -1)
{
index++
if (index >= visibleVCS.count)
{
return nil
}
else
{
return visibleVCS[index]
}
}
return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
var index = indexOfViewController(viewController)!
if (index != -1)
{
index--
if (index < 0)
{
return nil
}
else
{
return visibleVCS[index]
}
}
return nil
}
func indexOfViewController(viewController : UIViewController) -> Int?
{
for (var i = 0; i <= visibleVCS.count; i++)
{
if (viewController == visibleVCS[i])
{
return i
}
}
return -1
}
在我的原始代码中,visibleVC 只是一个 UIViewController 数组。