使用另一个UINavigationController推送视图控制器

这是我的应用程序的样子。 我已经分类了UINavigationController的方式,当你点击一个类似于导航栏的buttonMenuViewController滑出。 我怎样才能把我的VC1,VC2,VC3中的一个从UITableViewController菜单中的didSelectRow放到ContentViewController中?

  - > SlidingViewController
                  / \
            容器容器       
                 |  |
         MenuViewController ContentViewController
                 |  |
      UITableViewController SubClassed UINavigationController
                                   |  |  |  |
                                  VC1 VC2 VC3 VC4

通常我做类似下面的代码,但与上面的情况我不知道如何我可以推新视图控制器,如果我不在同一个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]; 

编辑:

可能的解决scheme,但我不知道如果这是一个好办法做到这一点。 我用单身保存了我的导航控制器,稍后再使用它。

在我的ContentViewController里面:

 [DataManager sharedDataManager].navController = self.navigationController; 

在MenuViewController的我的didSelectRow里面:

 [[DataManager sharedDataManager].navController presentViewController:controller animated:YES completion:nil]; 

您不希望MenuViewController知道视图控制器层次结构中除本身及其子项以外的任何内容。 你有两个select,允许这个好的devise。

1.使用委派

首先,你想有一个MenuViewControllerDelegate ,例如menuViewController:didSelectOption: 当菜单发生什么事情时, MenuViewController会发送一个合适的委托消息给它的委托对象。

现在要监听这个委托消息,你将需要一个控制器对象(可以是一个视图控制器或一个普通的NSObject ),它符合MenuViewControllerDelegate并将MenuViewControllerDelegate的委托设置为自己。 此控制器对象将处理任何MenuViewController可能发送的委托消息,例如,当select菜单选项时将新的视图控制器推送到ContentViewController

2.发布通知

这是两个更脆弱的。 如果在视图控制器层次结构中有许多事情需要知道菜单中发生什么事情,则可以使用通知。

因此, MenuViewController会发布一个通知,也许命名为MenuViewControllerDidSelectOptionNotification ,然后任何已经注册了该通知的感兴趣的接收者将接收到通知并执行其操作。

在您的应用程序委托(或响应您的编辑,任何持久的单身将工作,是),创build属性来容纳您的视图控制器实例。

 @property (nonatomic, strong) MenuViewController *menuViewController; 

…等所有你的VC。

每当你稍后初始化它们时,在App委托上设置这个属性来保存VC。

 MenuViewController *menuVC = [[MenuViewController alloc] init]; AppDelegate *appDel = [[UIApplication sharedApplication] delegate]; appDel.menuViewController = menuVC; 

现在,您可以随时获得此实例。 你也可以在menuViewController上设置你想保留在内存中的任何属性。

注意:要有意识成为一个好记忆的公民。 编写didReceiveMemoryWarning方法来发布任何你可以轻松地重新加载,当VC变得可见的时候,以便你不会让你的应用程序一次在内存中保存太多的东西。

你应该有一个类(可能是应用程序委托)来创build你的容器结构。 它可以访问创build的视图控制器。 您的表格视图控制器和导航控制器可能不是最初存在,但最初创build所有内容的类应该通过将导航控制器或内容视图控制器的引用传递给表视图控制器或菜单视图,在结构之间“build立桥梁”控制器。 该引用应该被存储在一个属性中,并允许你干净地呈现你的视图控制器。

这种设置比通过parentViewController或类似的链接导航更好,因为这将导致您以不透明的方式将您绑定到特定的结构。


或者,在故事板中,您可以添加一个IBOutlet属性,并直接在那里build立连接(如果所有的视图控制器都是在故事板加载前创build的)。