【问题标题】:MVC: Where to load views?MVC:在哪里加载视图?
【发布时间】:2009-06-12 21:21:10
【问题描述】:

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

现在,我在 nib 中加载了一个 viewController 实例,它的类型是 myViewController。笔尖也有 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 是否应该指向包含所有其他内容 UIView 子类(包括 musicGridView)的滚动视图?

【问题讨论】:

  • 所以...我试过这个,但只是得到一个空白屏幕。不知道我哪里出错了......

标签: iphone uiview model-view-controller


【解决方案1】:

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

与 IB 打交道时,您需要了解的两个最重要的事情是 IBOutletIBAction 关键字。

示例类头:

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

- (IBAction) doWork;

@end

现在,您可以使用 Interface Builder 将这两个东西连接起来,方法是用鼠标将源拖到目的地。如果您需要更好地说明如何执行此操作,YouTube 有很多关于 IB 的教程视频。

【讨论】:

    【解决方案2】:

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

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

    但是,如上所述,这种方法与以 IB 为中心的方法不兼容,正如 UIViewController Class Reference 中所证实的那样

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多