UINavigationController子类和推送Segues

时间:2014-03-20 06:09:48

标签: 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,我的中心面板(导航)需要是委托的子类,因为左侧面板上有一个菜单,我想在单击时切换视图。

@interface CenterViewController : UINavigationController <MenuDelegate>

基本上,由于此对象在运行时是一个CenterViewController,有没有办法将其强制转换为超类?我试过[自我超类]但是没有用(同样的错误)。

我需要在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];
    }
}

编辑: 有关图片的更多信息。 我很好奇导航控制器应如何与侧面板配合使用。我已经看过许多其他插件用于侧面板,这是一个例子。即使它有效,为什么它有2个导航控制器? ECSlidingViewController

以下是我们目前的设置: Our Setup

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

1 个答案:

答案 0 :(得分:1)

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

您收到的消息说

  

...推送segues只能   当源控制器由实例管理时使用   UINavigationController

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

您还没有准确地说出您的应用导航是如何工作的,但我怀疑UINavigationController无论如何都不是正确使用的工具。如果您使用侧边菜单允许用户以随机方式选择中央内容(即用户可以选择第一个选项,然后选择第五个选项,然后返回第一个选项),那么您可能只需要一个中心视图您显示所选视图。将观看次数推送到- (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; } 将最终得到一个大型的堆栈&#39;视图除非你在推送新视图之前弹出当前视图控制器,这更复杂,而不是你正在寻找的视觉效果。

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

更新

是的,我认为您在更新问题部分的正确轨道上。导航控制器用于以分层方式导航一系列相关视图 - 想想设置应用程序 - 您选择&#34; general&#34;或者&#34;墙纸&#34;或者其他 - 每一个都有一系列你可以浏览的视图;上下堆栈。

在您的应用中,它看起来像家,配置文件和设置应该都是导航控制器。您的根视图将只是一个视图。您的菜单将选择在根视图中显示哪个视图控制器 - 这就像一个标签栏控制器,除了您的菜单取代标签栏。

您可以分配您的家,个人资料和在appDelegate中设置视图控制器并将它们存储到appDelegate的属性中。然后你可以使用这样的东西:

{{1}}