如何使高级控制器加载视图控制器

时间:2012-06-08 21:06:06

标签: ios

我有一个高级控制器类,负责管理多个类并驱动状态机。

状态逻辑的一部分涉及临时显示几个不同的屏幕,每个屏幕都有一个专用的视图控制器,高级控制器创建这些其他控制器类,并根据需要将它们显示为模态视图控制器。

然而,其中一个视图控制器非常简单,它有一个按钮和一些文本可以随着状态的进展而改变。高级控制器是一个类,它知道在什么阶段显示什么文本,并且还需要知道何时按下按钮。

因此视图控制器需要提供一个API,高级控制器可以调用它来设置文本,而且高级控制器也需要是视图控制器的委托,因此可以在按钮时调用它被压了。 这似乎是不必要的管道,我想删除。

因此,我可以将视图控制器中的插座和操作移动到高级控制器中,因此不需要此管道。但是在视图控制器中没有任何东西(它是从一个nib实例化的)。所以我想完全摆脱它。

然后一旦它消失,我就打算在高级控制器中使用它:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"TheNib" bundle:nil];

or should it be:
UIViewController *vc = [[UIViewController alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"TheNib" owner:vc options:nil];

[[UIApplication sharedApplication].delegate.window.rootViewController presentViewController: self.vc animated: NO completion:nil];

然而,为了实现这一点,应该如何设置IB-具体而言 a)文件所有者应该设置为什么? b)IB中的观点可以设置为什么?

请注意,高级控制器已经从另一个类继承,因此我无法从UIViewController派生它,因此它没有view属性来连接到IB中的视图。

是否有一种简单的方法可以将xib内容连接到在高级视图控制器中创建的UIViewController?

3 个答案:

答案 0 :(得分:1)

您可以尝试更改文件所有者或将类对象添加到NIB ...

enter image description here

只需将“对象”拖动到对象列表并设置正确的类。然后,您可以使用连接到此对象的IBactions。

也许我提出(和回答)的这个问题可以帮到你:Coordinating Controller design pattern in Cocoa Touch

答案 1 :(得分:1)

视图及其控制器是“模块化元素”因此,如果视图有一个按钮,那么视图的控制器(而不是父控件)应该是按钮的目标。视图的控制器,确定父母/其他人对按钮事件感兴趣,应该定义父母/其他人可以参与的代理界面或通知界面。

在您的情况下,通过“删除不必要的管道”,您将1)远离“模块化元素”,2)创建困难,导致您询问与删除管道相关的问题。

最好只使用标准模式。

答案 2 :(得分:0)

如果您的所有视图都在显示某些文本和按钮,为什么不用UIAlertView替换它?它是一个简单的控件,用于显示一些文本和一个或两个按钮,带有一个定义良好的界面,用于获取按下哪个按钮。

当然这可能不适合您的设计,因为除非您使用第三方替代品(即http://cocoacontrols.com/platforms/ios/controls/tweetbot-like-uialertview-and-uiactionsheet-replacement),否则无法真正定制UIAlertView。