2015-05-11 19 views
2

我嘗試通過觸摸其中一個導航控制器(每個navigationcontroller與一個viewcontroller相關)上的按鈕來打開頁面,但是當我在pageviewcontroller中調用一個函數來更改索引並改變頁面它根本不工作...UIPageViewController:以編程方式移動頁面不起作用

我試過setViewController。

我想在Snapchat應用程序中做一個navbuttonitem,它可以滑動到左側或右側。

預先感謝您

這裏是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) 

} 
} 

回答

0

首先,你爲什麼不停止你的控制器的每個實例而不是重新實例化呢?這是該行:

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) 
} 

方向是.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不是強制性的,但我喜歡用它來避免重代表團。

相關問題