首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用导航UIPageViewController

禁用导航UIPageViewController
EN

Stack Overflow用户
提问于 2015-03-24 00:31:29
回答 3查看 1.1K关注 0票数 0

我有一个实现了UIPageViewController的应用程序,有14 ViewControllers,我需要禁用导航,直到动画完成,但默认情况下,我可以触摸或滑动来更改视图...

编辑:

PageViewController.swift

代码语言:javascript
复制
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都是由此扩展而来的)

代码语言:javascript
复制
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.
}



}
EN

回答 3

Stack Overflow用户

发布于 2015-03-24 00:44:29

您可以根据自己的需求尝试以下选项

推荐

代码语言:javascript
复制
self.navigationItem.leftBarButtonItem.enabled = NO;

self.navigationItem.rightBarButtonItem.enabled = NO;

或者简单地禁用on Edge case

代码语言:javascript
复制
self.view.window.userInteractionEnabled = NO;

更新:最近苹果不允许后退按钮启用/禁用。取而代之的是我们可以隐藏它。

代码语言:javascript
复制
self.navigationItem.hidesBackButton = YES;
票数 0
EN

Stack Overflow用户

发布于 2015-03-24 00:48:34

通常,最好不要阻止用户使用UI,并且可能会终止动画。

显然,这在您的用例中是不可能的。您可以在应用程序中创建标志,指示是否可以显示下一个控制器,并在viewControllerAfterViewController中创建逻辑以防止显示下一个控制器。

票数 0
EN

Stack Overflow用户

发布于 2015-03-24 01:55:11

我希望我把你的问题都回答对了

代码语言:javascript
复制
navigationController?.navigationBar.hidden = true

然后在动画结束后再播放一次

代码语言:javascript
复制
navigationController?.navigationBar.hidden = false
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29215451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档