这就是我的应用程序的样子。我以某种方式将UINavigationController子类化,当您点击类似于导航栏的按钮时,MenuViewController会滑出。如何将\ VC1,VC2,VC3之一从UITableViewController菜单内的didSelectRow推送到ContentViewController中?
-> SlidingViewController / \ Container Container | | MenuViewController ContentViewController | | UITableViewController SubClassed UINavigationController | | | | VC1 VC2 VC3 VC4
Usually I do something like the next code but with the situation above I'm not sure how I can push a new view controller if i'm not in the same UINavigationController.
NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[? presentViewController:controller animated:YES completion:nil];
编辑:
可能的解决方案有效,但是我不确定这是否是一个好方法。我已经使用单例来保存我的导航控制器,并在以后使用它。
在我的ContentViewController中:
[DataManager sharedDataManager].navController = self.navigationController;
在MenuViewController中的didSelectRow内部:
[[DataManager sharedDataManager].navController presentViewController:controller animated:YES completion:nil];
最佳答案
您不希望MenuViewController
了解视图控制器层次结构中除自身及其子级之外的任何内容。您有两种选择可以实现这种良好的设计。
1.使用委托
首先,您想要一个MenuViewControllerDelegate
,例如menuViewController:didSelectOption:
。当菜单中发生某些事情时,MenuViewController
将向其委托对象发送适当的委托消息。
现在,要侦听该委托消息,您将需要一个符合NSObject
的控制器对象(可以是视图控制器,或者只是常规的MenuViewControllerDelegate
),并将MenuViewController
的委托设置为其自身。然后,此控制器对象将处理MenuViewController
可能发送的任何委托消息,例如选择菜单选项后,将新的视图控制器推入ContentViewController
上。
2.发布通知
这是两者中比较脆弱的。如果您在视图控制器层次结构中有很多事情需要知道菜单中什么时候发生,则可以使用通知。
因此MenuViewController
将发布一个通知,也许名为MenuViewControllerDidSelectOptionNotification
,然后为该通知注册的任何感兴趣的接收者都将接收该通知并执行其操作。