2016-10-03 1 views
1

Так что я пытался из UIPageViewController, где у меня есть три различных View Controllers (3 разных классов)Swift - Переход через кнопки между 3 различными Просмотр контроллеров в UIPageViewController

Так что я сделал это работает! Я могу отлично перебрать из View Controller в View Controller! В viewDidLoad этих трех классов я сделал свой self.view.tag = 0,1,2 соответственно, поэтому я знаю, какой мой текущий контроллер просмотра. Вот код моего RootViewController в:

import UIKit 

class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 
@IBOutlet var bottomView: UIView! 

var pageViewController: UIPageViewController! 
var currentVCId = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    pageViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageViewController") as! UIPageViewController 
    pageViewController.dataSource = self 
    pageViewController.delegate = self 

    let starterVC = viewControllerWith(id: 0) 

    pageViewController.setViewControllers([starterVC], direction: .forward, animated: false, completion: nil) 
    pageViewController.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 

    self.addChildViewController(pageViewController) 
    self.view.addSubview(pageViewController.view) 
    self.view.bringSubview(toFront: bottomView) 

    pageViewController.didMove(toParentViewController: self) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func viewControllerWith(id: Int) -> UIViewController { 
    if id == 0 { 
     return self.storyboard?.instantiateViewController(withIdentifier: "FirstPageContentViewController") as! FirstPageContentViewController 
    } 
    else if id == 1 { 
     return self.storyboard?.instantiateViewController(withIdentifier: "SecondPageContentViewController") as! SecondPageContentViewController 
    } 
    else { 
     return self.storyboard?.instantiateViewController(withIdentifier: "RandomColorViewController") as! RandomColorViewController 
    } 
} 

func getViewControllerIdFor(previousViewController: Bool) -> Int? { 
    if previousViewController == true { 
     return currentVCId == 0 ? nil : currentVCId - 1 
    } 

    return currentVCId == 2 ? nil : currentVCId + 1 
} 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
    if let returnIdValue = getViewControllerIdFor(previousViewController: true) { 
     return viewControllerWith(id: returnIdValue) 
    } 

    return nil 
} 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
    if let returnIdValue = getViewControllerIdFor(previousViewController: false) { 
     return viewControllerWith(id: returnIdValue) 
    } 

    return nil 
} 

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    guard completed else { 
     return 
    } 

    let viewController = pageViewController.viewControllers![0] 
    currentVCId = viewController.view.tag 
} 

@IBAction func goToA(_ sender: UIButton) { 
    if currentVCId != 0 { 
     let currentVC = pageViewController.viewControllers?[0] 
     let previusVC = pageViewController(pageViewController, viewControllerBefore: currentVC!) 

     pageViewController.setViewControllers([previusVC!], direction: .reverse, animated: true, completion: nil) 
     currentVCId = 0 
    } 
} 

}

Дело в том, что я добавил 2 кнопки на мой RootViewController, чтобы перейти от View Controller для просмотра контроллера без ударяя .. Итак, давайте предположим, что у меня есть уже перевернулся во второй контроллер просмотра, и я хочу вернуться к первому, нажав левую кнопку. Помните, что мой первый VC уже загружен, поэтому я мог изменить его содержимое.

Итак, теперь , если я нажму кнопку, его код будет последним методом выше, он будет перемещаться назад, но он создаст новый экземпляр желаемого VC ! Что я хочу сделать, это показать мой уже загруженный VC, как если бы я проскользнул ... Как Snapchat ...

Любая идея о том, как этого достичь?

+0

Просто используйте метод, который вызывается при прокручивании –

+0

@Lu_ Если вы посмотрите на мой код, вы увидите, что это то, что я делаю ... –

+0

Показывать до и после Просмотр страницы Способ делегата-контроллера –

ответ

1

Это из documentation на instantiateViewController(withIdentifier:)

Этот метод создает новый экземпляр указанного контроллера представления каждый раз, когда вы вызываете его.

Вот почему вы получаете новые экземпляры. Я бы порекомендовал другой подход. Вместо того, чтобы позволить pageViewController отслеживать VC и получать их слепо по индексу и тегу, почему бы не сохранить их как свойство в вашем корне? Это позволит вам обеспечить тот же экземпляр VC и позволит вам уклониться от проверки того, что теги (которые являются грязными), для чего-то более читаемого, например, для проверки равенства с фактическим объектом VC.

+0

честный, я тоже об этом думал, но я следил за логикой, которую каждый другой учебник я нашел. Я попробую, и я дам вам знать! –

+0

Просто вопрос ... Почему это работает, когда я сажусь? Использует ли он какое-то кэширование? –

Смежные вопросы