MVC:在哪里加载视图?

时间:2009-06-12 21:21:10

标签: iphone uiview model-view-controller

我有一个相对简单的应用程序。我有一个用户与之交互的全屏UIView子类(musicGridView),以及一个加载此类的UIScrollView子类(scrollView),以及一个ViewController和mainWindow.xib。

现在,我在nib中加载了一个viewController实例,它的类型为myViewController。 nib也有myUIView的实例,myViewController指向它。

在AppDelegate中,我这样做:

[window addSubview:scrollView];
[scrollView addSubview: viewController.view];
scrollView.musicGridView = (MusicGridView*) viewController.view;
我认为这是错误的。理想情况下,appDelegate没有scrollView实例。

在scrollView的AwakeFromNib类中,我在scrollView上进行初始化。

我认为应该采用的方法是在appDelegate中加载[window addSubview:viewController.view],然后将viewController指向scrollView的实例而不是musicGridView。然后,在scrollView awakeFromNib中添加musicGridView的子视图。

最终,我想创建另一个由scrollView拥有的视图,该视图实际上是一个侧面TabBar(使用给定的API是不可能的)用户可以向左滚动到达。

所以我猜其他MVC的东西,问题是,viewController应该指向scrollView,它包含所有其他内容的UIView子类,包括musicGridView?

2 个答案:

答案 0 :(得分:0)

听起来您没有使用Interface Builder来设计UI。由于这是一个新项目,我建议这样做。您根本不必编写任何类似的代码。但是,您需要描述您的出路和行动。

在处理IB时,您需要了解的两个最重要的事项是IBOutletIBAction个关键字。

示例类标题:

@interface MyClass : NSObject {
  IBOutlet UIScrollView* myScrollView;
}

- (IBAction) doWork;

@end

现在,您可以使用Interface Builder通过使用鼠标将源拖动到目标来连接这两件事。如果您需要更好地描述如何执行此操作,YouTube上有很多关于IB的教程视频。

答案 1 :(得分:0)

我是一个不使用Interface Builder进行UI设计的人;根据我的经验,你需要全部IB或全程序化。为了解决您的特定问题,我认为您需要将musicGridView作为UIScrollView的实例或扩展。

这可以在你的自定义viewController的loadView方法中完成 - 只需将它初始化为UIScrollView(并添加内容),而不是普通的旧UIView。

然而,如上所述,这种方法与以IB为中心的方法不兼容,正如UIViewController Class Reference

中所证实的那样。
  

UIViewController的所有子类   应该实现loadView方法   设置视图属性除非你   从nib文件加载视图