我一直在寻找这个问题,它可能有一个简单的答案: 根据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个导航控制器?
以下是我们目前的设置:
所以基本上,我是否想要将新VC推送到现有的NavVC?按下菜单按钮时按下新的NavVC会更好吗?当我们从地图视图进入子视图时会发生什么。菜单是否可以通过滑动访问?
答案 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}}