2

这就是我的应用程序的样子。我对 UINavigationController 进行了子类化,当您点击类似于导航栏的按钮时,MenuViewController 会滑出。如何将我的 VC1、VC2、VC3 之一从 UITableViewController 菜单内的 didSelectRow 推送到 ContentViewController 中?

                -> 滑动视图控制器
                 / \
            集装箱集装箱       
                | |
        菜单视图控制器内容视图控制器
                | |
     UITableViewController 子类 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];

编辑:

可行的可能解决方案,但我不确定这是否是一个好方法。我已经使用单例来保存我的导航控制器并在以后使用它。

在我的 ContentViewController 中:

[DataManager sharedDataManager].navController = self.navigationController;

在 MenuViewController 我的 didSelectRow 内:

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

3 回答 3

4

您不希望MenuViewController了解视图控制器层次结构中除其自身及其子级之外的任何内容。您有两种选择可以实现这种良好的设计。

1.使用委托

首先,您想要一个MenuViewControllerDelegate具有例如menuViewController:didSelectOption:. 当菜单中发生某些事情时,MenuViewController将向其委托对象发送适当的委托消息。

现在要监听该委托消息,您将需要一个控制器对象(可以是视图控制器或只是一个常规的NSObject),该对象符合MenuViewControllerDelegate并将委托设置MenuViewController为自身。然后,该控制器对象将处理可能发送的任何委托消息,例如,在选择菜单选项时MenuViewController将新的视图控制器推送到上面。ContentViewController

2.发布通知

这是两者中比较脆弱的一个。如果您的视图控制器层次结构中有很多东西需要知道菜单中何时发生某些事情,您将使用通知。

所以MenuViewController会发布一个通知,可能命名为MenuViewControllerDidSelectOptionNotification,然后任何已注册该通知的感兴趣的接收者都会收到通知并做他们的事情。

于 2013-07-05T06:07:30.837 回答
2

在您的 App Delegate 中(或响应您的编辑,任何持久的单例都可以工作,是的),创建属性来保存您的 View Controller 实例。

@property (nonatomic, strong) MenuViewController *menuViewController;

...等你所有的vc。

每当您稍后初始化它们时,请在 App 委托上设置此属性以保存 VC。

MenuViewController *menuVC = [[MenuViewController alloc] init];

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

现在,您可以在需要呈现它的任何时候获取此实例。您还可以在 menuViewController 上设置要保留在内存中的任何属性。

注意:注意做一个好的记忆公民。编写 didReceiveMemoryWarning 方法以在 VC 再次可见时释放您可以轻松重新加载的任何内容,这样您就不会因为一次在内存中保存太多东西而导致应用程序崩溃。

于 2013-07-04T18:21:07.757 回答
1

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

这种设置比浏览parentViewController或类似的链接更可取,因为这会导致您以不透明的方式将您绑定到特定结构。


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

于 2013-07-04T16:32:01.927 回答