【问题标题】:UIPageViewController : move programmatically page doesn't workUIPageViewController:以编程方式移动页面不起作用
【发布时间】:2015-07-22 05:30:26
【问题描述】:

我尝试通过触摸两个导航控制器之一上的按钮来翻页(每个导航控制器都与视图控制器相关),但是当我调用 pageviewcontroller 中的函数来更改索引和更改页面时,它不起作用全部...

我试过 setViewController。

我想在 snapchat 应用程序中做类似的事情,一个可以向左或向右滑动的导航按钮项。

提前谢谢你

这是pageviewcontroller的代码:

class PageViewController: UIPageViewController,UIPageViewControllerDataSource, UIPageViewControllerDelegate{

    var index = 0
    var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"]

override func viewDidLoad() {

    self.dataSource = self
    self.delegate = self

    let startingViewController = self.viewControllerAtIndex(self.index)
    let viewControllers: NSArray = [startingViewController]
    self.setViewControllers(viewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) 
}

func viewControllerAtIndex(index: Int) -> UINavigationController! {

    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
    //first view controller = firstViewControllers navigation controller
    if index == 0 {

        return storyBoard.instantiateViewControllerWithIdentifier("FirstNavigationController") as UINavigationController

    }

    //second view controller = secondViewController's navigation controller
    if index == 1 {

        return storyBoard.instantiateViewControllerWithIdentifier("SecondNavigationController") as UINavigationController
    }

    return nil
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

    let identifier = viewController.restorationIdentifier
    let index = self.identifiers.indexOfObject(identifier!)

    //if the index is the end of the array, return nil since we dont want a view controller after the last one
    if index == identifiers.count - 1 {

        return nil
    }

    //increment the index to get the viewController after the current index
    self.index = self.index + 1
    return self.viewControllerAtIndex(self.index)

}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

    let identifier = viewController.restorationIdentifier
    let index = self.identifiers.indexOfObject(identifier!)

    //if the index is 0, return nil since we dont want a view controller before the first one
    if index == 0 {

        return nil
    }

    //decrement the index to get the viewController before the current one
    self.index = self.index - 1
    return self.viewControllerAtIndex(self.index)

}
}

【问题讨论】:

    标签: swift button move viewcontroller uipageviewcontroller


    【解决方案1】:

    首先,为什么不停止控制器的每个实例而不是重新实例化它?这是行:

    func viewControllerAtIndex(index: Int) -> UINavigationController! {
    
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
    //first view controller = firstViewControllers navigation controller
    if index == 0 {
    
        return storyBoard.instantiateViewControllerWithIdentifier("FirstNavigationController") as UINavigationController
    
    }
    
    //second view controller = secondViewController's navigation controller
    if index == 1 {
    
        return storyBoard.instantiateViewControllerWithIdentifier("SecondNavigationController") as UINavigationController
    }
    
    return nil}
    

    您可以创建一个包含所有实例的本地数组..

    然后,要以编程方式在页面之间移动,您可以这样使用setViewController

    func showAViewController(){
        let startVC : NSArray = [viewController]
    
        setViewControllers(startVC as! [AnyObject], direction: .Reverse, animated: true, completion: nil)
    }
    

    direction 是 .Reverse 还是 .Forward 取决于目标视图控制器相对于当前视图控制器的位置。

    这是我编写的测试程序示例,它对我有用:

    class RootVC: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
    
    var viewController1 : UIViewController!
    var viewController2 : UIViewController!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        dataSource = self
    
        viewController1 = storyboard?.instantiateViewControllerWithIdentifier("viewController1") as! UIViewController
        viewController1.title = "viewController1"
    
        viewController2 = storyboard?.instantiateViewControllerWithIdentifier("viewController2") as! UIViewController
        viewController2.title = "viewController2"
    
        var startingVC : NSArray = [viewController1]
        setViewControllers(startingVC as! [AnyObject], direction: .Forward, animated: false, completion: nil)
    
        Notifications.addObserver(self, selector: "showViewController1", name: "showViewController1", object: nil)
        Notifications.addObserver(self, selector: "showViewController2", name: "showViewController2", object: nil)
    }
    
    deinit{
        Notifications.removeObserver(self)
    }
    
    func showViewController1(){
        let startVC : NSArray = [viewController1]
    
        setViewControllers(startVC as! [AnyObject], direction: .Forward, animated: true, completion: nil)
    }
    func showViewController2(){
        let startVC : NSArray = [viewController1]
    
        setViewControllers(startVC as! [AnyObject], direction: .Forward, animated: true, completion: nil)
    }
    
    
    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        switch viewController.title!{
            case "viewController1": return nil
            case "viewController2": return viewController1
        default: return nil
        }
    }
    
    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        switch viewController.title!{
        case "viewController1": return viewController2
        case "viewController2": return viewController1
        default: return nil
        }
    }}
    

    NSNotifications不是强制性的,但我喜欢使用它来避免繁重的委托。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2013-02-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多