Ios u导航控制器子类和推送序列

Ios u导航控制器子类和推送序列,ios,iphone,objective-c,uinavigationcontroller,segue,Ios,Iphone,Objective C,Uinavigationcontroller,Segue,我已经查找了一段时间,它可能有一个简单的答案: 根据苹果的文档,在ios6之前,我们可以将UINavigationController子类化。当标识符阻止任何不是UINavigationController的内容时,我们如何执行segue-from-identifier。主要是: uncaught exception 'NSGenericException', reason: 'Could not find a navigation controllerfor segue 'profileSe

我已经查找了一段时间,它可能有一个简单的答案: 根据苹果的文档,在ios6之前,我们可以将UINavigationController子类化。当标识符阻止任何不是UINavigationController的内容时,我们如何执行segue-from-identifier。主要是:

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,我的中间面板(导航)需要是代理的子类,因为在左面板上有一个菜单,我想在单击时切换视图

@interface CenterViewController : UINavigationController <MenuDelegate>
编辑: 更多信息与图片。 我很好奇导航控制器应该如何与侧面板配合使用。我已经看过了许多其他的侧面板插件,下面是一个例子。即使它可以工作,为什么它有2个导航控制器?

以下是我们当前的设置:


所以,基本上,我想把一个新的风险投资推到现有的NavVC上,这是错误的吗?按下菜单按钮时,按下新的NavVC是否更好?当我们从“地图”视图进入子视图时会发生什么。菜单是否可以通过滑动访问?

如果仔细查看该消息,您会发现问题不是由子类化
UINavigationController
引起的,而是因为您正在对(子类化的)
UINavigationController
执行序列。推送序列针对嵌入在
UINavigationController
中或由
UINavigationController
管理的
UINavigationController
执行,然后系统通过视图控制器的
navigationController
属性查找管理的
UINavigationController
,以执行推送

你收到的信息说

…推送序列只能 当源控制器由的实例管理时使用 导航控制器

在您的情况下,源控制器是UINavigationController的实例,它不是由UINavigationController管理的

你还没有说你的应用导航是如何工作的,但我怀疑UINavigationController无论如何都不是合适的工具。如果您使用侧菜单允许用户以随机方式选择中心内容(即,用户可以先选择第一个选项,然后选择第五个选项,然后再返回第一个选项),则您可能只需要有一个中心视图,在其中显示所选视图。将视图推送到
UINavigationController
上会得到一大堆视图,除非您在推新的视图控制器之前弹出当前视图控制器,这更复杂,而且不是您想要的视觉效果

您仍然可以实现“推送”样式转换,但需要使用自定义segue。如果是我,如果用户选择了比当前选项更接近顶部的菜单项,我可能会从左边按,如果新项目比当前选项更接近底部,我可能会从右边按,但我还是在假设你的应用程序导航是如何工作的

更新

是的,我认为你的最新问题部分是正确的。导航控制器用于以分层方式导航一系列相关视图—想想设置应用程序—您选择“常规”或“墙纸”或其他任何选项—然后每个控制器都有一系列视图供您导航;上下堆叠

在你的应用程序中,主页、个人资料和设置都应该是导航控制器。您的根视图将只是一个视图。您的菜单将选择在根视图中显示哪个视图控制器-这类似于选项卡栏控制器,只是您的菜单取代了选项卡栏

您可以在appDelegate中分配主视图、配置文件和设置视图控制器,并将它们存储到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;
}

您的代理人是否需要是UINavigationController?您不能创建另一个对象作为代理,然后允许该对象切换视图吗?我担心JaSidePanels是否会断开,因为我需要在“CenterViewController”中设置代理。如果我将代理切换回UINavigation控制器,我将如何设置代理?我会用更多的信息更新这个问题。谢谢你的回答,保罗,我用图片和更多的问题更新了这个问题。我可能在想NavVC的错误。你能解释一下我错在哪里吗?我已经根据你提供的新信息更新了我的答案。我更新答案时有点匆忙,因为我不得不离开,但我刚刚意识到我应该使用segue调用来选择视图,而不是添加子视图-但想法是一样的
- (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;
}