2015-03-23 2 views
0

У меня есть приложение с реализацией UIPageViewController, с 14 ViewControllers, и мне нужно, чтобы отключить навигацию до анимации конца, но по умолчанию, я могу коснуться или салфетки, чтобы изменить вид ...Отключить навигации UIPageViewController

Edit:

PageViewController.swift

import UIKit 

class PageViewController: UIViewController, UIPageViewControllerDataSource { 
var contentPageRestorationIDs = [String]() 
var pageViewController = UIPageViewController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    contentPageRestorationIDs = ["FirstView", "SecondView", "ThirdView", "FourthView", "FiveView", "SixView", "SevenView", "EightView", "NineView", "TenView", "ElevenView", "TwelveView", "ThirteenView", "FourteenView"] 
    // Do any additional setup after loading the view, typically from a nib. 

    pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as UIPageViewController 
    pageViewController.dataSource = self 

    var startingController: UIViewController = self.viewControllerAtIndex(0)! 

    pageViewController.setViewControllers([startingController], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil) 

    self.addChildViewController(self.pageViewController) 
    self.view.addSubview(self.pageViewController.view) 
    self.pageViewController.didMoveToParentViewController(self) 


} 

func goToPreviousContentViewController(){ 

    var currentViewController: AnyObject = self.pageViewController.viewControllers[0] 
    var vcRestorationID = currentViewController.restorationIdentifier 
    var index = find(contentPageRestorationIDs, vcRestorationID!!) 

    var previousViewController: UIViewController = self.viewControllerAtIndex(index! - 1)! 

    pageViewController.setViewControllers([previousViewController], direction: UIPageViewControllerNavigationDirection.Reverse, animated: false, completion: nil) 



} 

func goToNextContentViewController(){ 

    var currentViewController: AnyObject = self.pageViewController.viewControllers[0] 
    var vcRestorationID = currentViewController.restorationIdentifier 
    var index = find(contentPageRestorationIDs, vcRestorationID!!) 

    var nextViewController: BaseContentViewController = self.viewControllerAtIndex(index! - 1)! 

    pageViewController.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) 



} 

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

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> (UIViewController?){ 
    var vcRestorationID = viewController.restorationIdentifier 
    var index = find(contentPageRestorationIDs, vcRestorationID!) 

    if(index == 0){ 
     return nil 
    } 
    return viewControllerAtIndex(index! - 1) 
} 

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> (UIViewController?){ 
    var vcRestorationID = viewController.restorationIdentifier 
    var index = find(contentPageRestorationIDs, vcRestorationID!) 

    if(index == contentPageRestorationIDs.count - 1){ 
     return nil 
    } 
    return viewControllerAtIndex(index! + 1) 


} 


func presentationCountForPageViewController(pageViewController: UIPageViewController) -> (Int){ 
    return self.contentPageRestorationIDs.count 
} 

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> (Int){ 
    return 0 
} 


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

    if(index >= contentPageRestorationIDs.count){ 
     return nil 
    } 

    var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType)) 

    var contentViewController: BaseContentViewController = storyboard.instantiateViewControllerWithIdentifier(self.contentPageRestorationIDs[index]) as BaseContentViewController 

    contentViewController.rootViewController = self 

    contentViewController.loadView() 

    return contentViewController 

} 
} 

BaseContentViewController.swift (Все мои ViewControllers простирается от этого)

import UIKit 

class BaseContentViewController: UIViewController { 

var rootViewController: PageViewController = PageViewController() 
var goNext = Bool() 
override func viewDidLoad() { 
    super.viewDidLoad() 


    // Do any additional setup after loading the view. 
} 

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



} 
+0

Попробуйте настройки страницы контроллера представления 'dataSource' до нуля, до анимации завершил, а затем снова установил его, как только вы счастливы для продолжения навигации. В документах: «Методы источника данных вызывается в ответ на навигацию на основе жестов. Если значение этого свойства равно nil, тогда навигация с помощью жестов отключается». – pbasdf

+0

Спасибо, но, как я могу изменить dataSource из ViewController ??? – PlugInBoy

+0

Я думаю, что я бы выполнил обратный вызов протокола/делегата с ViewController на контроллер просмотра страницы. В контроллере просмотра определите протокол с помощью таких методов, как «enableNavigation» и «disableNavigation», и свойство делегата, которое принимает этот протокол. В ПВХ установите свойство delegate 'self' при создании ViewControllers и реализуйте эти два метода для установки/очистки источника данных. – pbasdf

ответ

0

Вы можете попробовать на следующий вариант на ваше требование

Рекомендованный

self.navigationItem.leftBarButtonItem.enabled = NO; 

self.navigationItem.rightBarButtonItem.enabled = NO; 

или просто отключить с помощью на пограничном случае

self.view.window.userInteractionEnabled = NO; 

Обновление: Недавно Apple не позволяет вернуться для включения/выключения. Вместо этого мы можем скрыть это.

self.navigationItem.hidesBackButton = YES; 
+0

Спасибо за ваш ответ, но я не использую навигационные кнопки для навигации. Если я отключу взаимодействие с пользователем, я нарушу функциональность моего приложения – PlugInBoy

0

В целом, было бы лучше не запрещать пользователю использовать пользовательский интерфейс и, возможно, прекратить анимацию.

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

+0

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

+0

Спасибо, я обновил ответ. – MirekE

+0

Да, я это вижу. Невозможно иметь эффект книги, но отключить взаимодействие с левым и правым краями до времени? – PlugInBoy

0

Я надеюсь, что я получил свой вопрос прямо просто использовать

navigationController?.navigationBar.hidden = true 

затем после окончания анимации показать его снова

navigationController?.navigationBar.hidden = false 
+0

У меня есть панель навигации, скрытая во всех приложениях – PlugInBoy