ios - UINavigationController 子类并推送 Segues

标签 ios iphone objective-c uinavigationcontroller segue

我已经查了一段时间了,它可能有一个简单的答案: 根据 Apple 文档,在 ios6 之后,我们可以子类化 UINavigationController。当它阻止任何不是 UINavigationController 的东西时,我们如何从标识符执行 segue。主要是:

uncaught exception 'NSGenericException', reason: 'Could not find a 
navigation controllerfor segue 'profileSegue'. Push segues can only 
be used when the source controller is managed by an instance of 
UINavigationController.

我正在使用 JaSidePanels,我的中心面板(导航)需要成为委托(delegate)的子类,因为左侧面板上有一个菜单,我想在单击时切换 View 。

@interface CenterViewController : UINavigationController <MenuDelegate>

基本上,由于这个对象在运行时是一个 CenterViewController,有没有办法将它转换为它的父类(super class)?我试过 [self superclass] 但没有用(同样的错误)。

我需要在 CenterViewController 中调用这段代码。是否可以将其移动到 UINavigationController?

- (void)viewDidLoad
{

RootViewController *rootViewController = (RootViewController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];
MenuViewController *leftViewController = (MenuViewController *)rootViewController.leftPanel;

// Store a reference to the center view controller in the left view controller's delegate property
leftViewController.menuDelegate = self;

[super viewDidLoad];
}

- (void) MenuItemSelected: (NSString*) item
{
    if ([item isEqualToString:@"Home"]) {
        //These would throw the error since we're not technically a "UINavigationController"
        //[self performSegueWithIdentifier: @"mapViewController" sender: nil];
    } else if ([item isEqualToString:@"Profile"]) {
        //[self performSegueWithIdentifier: @"profileSegue" sender: self];
    }
}

编辑: 带图片的更多信息。 我很好奇导航 Controller 应该如何与侧面板一起工作。我看过许多其他侧面板插件,这里是一个例子。尽管它可以工作,但为什么它有 2 个导航 Controller ? ECSlidingViewController

这是我们当前的设置: Our Setup

所以基本上,我想将新的 VC 推送到现有的 NavVC 的意义上是否是错误的?当按下菜单按钮时推送新的 NavVC 会更好吗?当我们从 map View 进入 subview 时会发生什么。可以通过滑动访问菜单吗?

最佳答案

如果您仔细查看消息,您会发现您的问题不是由 UINavigationController 的子类引起的,而是因为您正在针对您的(子类)UINavigationController 执行 segue >。推送 Segue 是针对嵌入在 UINavigationController 中或由 UINavigationController 管理的 UIViewController 执行的,然后系统通过 View Controller 的navigationController 属性以执行推送。

您收到的消息显示

...Push segues can only be used when the source controller is managed by an instance of UINavigationController

在您的情况下,源 Controller UINavigationController 的一个实例,它不是 UINavigationController 管理。

您还没有确切说明您的应用程序导航是如何工作的,但我怀疑 UINavigationController 无论如何都不是正确的工具。如果您使用侧面菜单允许用户以随机方式选择中心内容(即用户可以选择第一个选项,然后选择第五个选项,然后返回第一个选项),那么您可能应该有一个中心 View 您将显示所选 View 。将 View 推送到 UINavigationController 上最终会得到一大堆 View ,除非您在推送新 View Controller 之前弹出当前 View Controller ,这更加复杂,而且不是您正在寻找的视觉效果.

您仍然可以实现“推”式转换,但您需要使用自定义转场。如果是我,如果用户选择的菜单项比当前选项更接近顶部,我可能会从左侧插入,如果新项目比当前选项更接近底部,我可能会从右侧插入,但我再次做出关于您的应用导航如何工作的假设。

更新

是的,我认为您在更新问题的部分是在正确的轨道上。导航 Controller 用于以分层方式导航一系列相关 View - 想想“设置”应用程序 - 您选择“常规”或“壁纸”或其他任何内容 - 每个 Controller 都有一系列您可以导航的 View ;上下堆叠。

在您的应用程序中,主页、配置文件和设置看起来都应该是导航 Controller 。那么你的 Root View 就只是一个 View 。您的菜单将选择在 Root View 中显示哪个 View Controller - 这就像选项卡栏 Controller ,只不过您的菜单取代了选项卡栏。

您可以在您的 appDelegate 中分配您的主页、个人资料和设置 View Controller ,并将它们存储到 appDelegate 的属性中。然后你可以使用这样的东西:

- (void) MenuItemSelected: (NSString*) item
{
    myappDelegate *app=(myappDelegate *)[UIApplication sharedApplication].delegate;


    [delegate.currentViewController removeFromParentViewController]; 
    UIViewController *newController;
    if ([item isEqualToString:@"Home"]) {
        newController=app.homeViewController;

    } else if ([item isEqualToString:@"Profile"]) {
        newController=app.profileViewController;
    }

    if (app.currentViewController != newController)
    {
        [app.currentViewController removeFromParentViewController];
        [app.rootViewController addChildViewController:newController];
        app.currentViewController = newController;
}

关于ios - UINavigationController 子类并推送 Segues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22524775/

相关文章:

ios - 更改静态 TableView 单元格高度

ios - 无法在 iOS 中配置 facebook LoginButtonDelegate

objective-c - ios从私网地址读取内容

ios - 在 xcode 中找不到生成的头文件

iphone - NSString - 如何从 "ÁlgeBra"到 "Algebra"

ios - 将图像从 UIimageView 保存到 Core Data

objective-c - 在 Objective-C/C 中,你能写一个结合 2 个 block 的函数吗?

ios - 如何比较 ios 中大于 3 秒的时间

ios - 调整 FontSizeToFitWidth 时裁剪 UILabel

iphone - iOS 5 跨多个场景保持一致的标签栏