【问题标题】:iOS layout; I'm not getting itiOS 布局;我不明白
【发布时间】:2011-06-08 12:51:22
【问题描述】:

嗯,“不明白”太苛刻了;我已经把它用于对我来说是一个合乎逻辑的设置,但它似乎不是 iOS 认为合乎逻辑的。所以我没有得到任何东西。

假设我有一个显示两条信息的应用;日期和表格。根据 MVC 方法,我在这里使用了三个 MVC,一个用于日期,一个用于表格,另一个将这两个 MCV 合并到一个屏幕中,然后将它们连接起来。

主 MVC 知道它想要如何/在哪里布局两个子 MVC。每个细节 MVC 只在主 MVC 指定的范围内处理自己的子节点。比如:

- (void)loadView {
    MVC* mvc1 = [[MVC1 alloc] initwithFrame:...]
    [self.view addSubview:mvc1.view];

    MVC* mvc2 = [[MVC2 alloc] initwithFrame:...]
    [self.view addSubview:mvc2.view];
}

如果以上是合乎逻辑的(对我来说就是这样),那么我希望任何 MVC 类都有一个构造函数“initWithFrame”。但是 MVC 没有,只​​有视图才有这个。

为什么?

如何正确布局嵌套的 MVC? (当然我不只有这两个,但是detail MVCs又有sub MVCs。)


感谢大家的回复。我将研究提供的链接。

让我再次尝试解释我的问题,希望能更清楚地说明问题。请注意,我已经发现我的视图与 iOS 的不匹配,因为我不喜欢我的代码的去向。

是的,我将 UIViewController 称为“MVC”,因为它目前实现了 MVC 的所有方面;它具有控制器代码和嵌入式视图,而且控制器通常还保存并提供数据(所有 TableView 示例都是这样实现的)。

MVC 可以存在于多个层面;基本上 UITextField 可以(应该?)是 MVC;有一个视图,但也涉及控制器逻辑,您不想与其他代码混合。封装。例如:Java 的 Swing JTextField 有一个 MVC。 JTable、JList、...多个 MVC 模式嵌套在其他 MVC 中以构建整个屏幕也是如此。

当某些平台说它使用 MVC 模式时,这是我所期望的。因此,当我对表格进行编码时,我创建了一个 MVC,并且只向它发送带有日期作为参数的 loadData 消息。它需要自己处理其余的事情。我有一个可以滑入的 Detail MVC;然后我告诉它它需要展示的对象,它需要自己处理其余部分。封装。

所以我有很多带有嵌入式 UIViews 的 UIViewControllers。这不是这样做的方法......

【问题讨论】:

  • 你说的这个 MVC 对象是什么?你指的是 UIViewControllers 吗?
  • 首先,你只有 1 个 MVC。除非该表引用 CoreData 数据集,否则我确定您只有 1 个 MVC。你自己说的 = 1 个视图,带有日期和表格。这些“子视图”中的每一个都可以在主控制器中进行控制。 Check out this tutorial.
  • @Tbee,这是一个better article from Apple.,里面有关于 MVC 东西的图片。
  • @Stephen 我仍然不明白将 MVC ——模型视图控制器 设计模式——作为一个东西。 OP 写得好像模式是您实例化的对象,并且您引用了“1 MVC”。我对你们俩都使用的术语有什么不明白的地方?您可以拥有 1 个或多个模型、1 个或多个视图以及 1 个或多个控制器,所有这些都有不同的关系,但没有——据我所知——一个 MVC。你们谁能启发我?
  • @Matthew,你是对的。我只是对他说他的语言。你说得对,它是一种模式。他认为每个视图都需要一个控制器和模型,这不一定是正确的。在他描述的应用程序中,只有一种 MVC 模式的实现。他认为每个子视图需要它自己的控制器。现在,在复杂的情况下,这是正确的 - 您可以使用自己的控制器加载 nib,但在这种情况下,他只学习如何使用 IB 和单个 UIViewController 会更容易。

标签: model-view-controller ios layout


【解决方案1】:

感谢您的链接,我会调查它们。

到目前为止,我已经将我的大部分应用程序重写为使用视图而不是视图控制器(顶级控制器除外),并且它开始与可用的 API 调用相匹配,例如 layoutSubviews。令我感到不安的是,我现在需要这样做:

[tableDataSource loadData:date];
[tableView reloadData];

在我之前的设置中,我所做的只是:

[tableViewController loadData:date];

但显然这就是这样做的方法。一件事对我来说是不清楚的 ATM。由于我在 AppViewController 的 loadView 中构造和布局视图,如果方向发生变化,它们如何重新布局。 VC 没有 layoutSubviews,所以我应该使用 didRotateFromInterfaceOrientation 并从那里重新定位子视图?

顺便说一句,我不会将匿名内部类注册为侦听器(观察者)。我在编写 Swing 组件和 JavaFX 控件方面非常有经验。这可能是罪魁祸首,在 Java(FX) 中,每个组件都有一个视图和一个控制器(并不总是一个模型)。

【讨论】:

    【解决方案2】:

    另一个潜在的链接是 WWDC 2010 关于 MVC 的精彩演讲。

    http://developer.apple.com/videos/wwdc/2010/

    这是 Session 116 - iPhone OS 的模型-视图-控制器

    本次会议充满了关于 MVC 的真正工作原理、它的运行原理以及它为何如此出色的实用建议。但它也有很多介绍性的东西,可以帮助刚接触这个概念的人理解它。

    如果我理解您在上面关于 Java 的 Swing 类的句子,您是在谈论响应事件的匿名类吗?如果是这样,那些不是“MVC”,它们就是所谓的“观察者”,当他们从视图中观察事件时,他们会采取一些行动(通常向控制器发送消息)。 Cocoa Touch 使用 Target/Action 范例(和委托)来实现这一点。

    我还强烈建议您采纳 Matthew 和 Stephen 的建议并编写一堆代码。如果您不建立直觉基础,那么提出正确的问题(这是获得好答案所需的大部分内容)将非常困难。

    我真的认为 WWDC 2010 演讲会有所帮助。

    祝你好运!

    【讨论】:

      【解决方案3】:

      Tbee,

      我将在此处发布一个小代码示例,因为您似乎并没有真正理解它。

      @interface MyView : UIView
      
      @property (retain) IBOutlet UIButton *button1;
      @property (retain) IBOutlet UIButton *button2;
      
      @property (assign) bool myData;
      
      -(IBAction) doButton1:(id)sender;
      -(IBAction) doButton2:(id)sender;
      
      @end;
      
      @implementation MyView
      
      @synthesize button1 = _button1;
      @synthesize button2 = _button2;
      @synthesize myData = _myData;
      
      // I'm leaving out the initWithNib, viewDidLoad, etc.
      
      - (IBAction) doButton1:(id)sender
      {
        // do something as a result of clicking button1
        _myData = YES;
      }
      
      - (IBAction) doButton2:(id)sender
      {
        // do something as a result of clicking button2
        _myData = NO;
      }
      
      @end
      

      在 InterfaceBuilder 中将它们连接起来,你就有了一个工作的“MVC”。您不需要为每个按钮使用全新的 UIViewController。视图负责处理它。

      UITableView 和它关联的 View 更复杂,可能需要额外的 UIViewController 来帮助封装。我真的不建议从使用它们开始,但这是一个good tutorial here. 它有a lot of images,它将向您展示如何在 IB 等中连接事物。它很旧,所以您的 XCode 可能看起来不像图像,但它有帮助。

      【讨论】:

        【解决方案4】:

        如果我理解您的问题——我可能不会,请查看我的 cmets——我认为您将 MVC 设计模式应用得太细了。最常见的是在您描述的设置中,您将拥有一个模型、一个控制器和多个分组/组合的视图,如.xib 文件中。

        在 Cocoa Touch 术语中,您将拥有一个 UIView,其中包含一个带有日期的 UILabel 和一个用于表格的 UITableView。这些是您的意见。

        您肯定会有一个用于表数据的模型,可能是一个数据数组。您的日期数据可能来自它自己的模型,如果它是从某物检索或计算的日期,或者其他完全独立于数据数组的东西。如果它与数组数据相关联——它们都是从数据库中提取的,或者日期是从数组数据中计算出来的,或者你有什么——那么你就有一个模型。

        如果数据全部来自单个模型,那么单个控制器可能没问题。即使数据来自多个来源/模型,您也可能在此设置中只需要/想要一个控制器。 UITableView 将有一个 UITableViewController,并且同一个控制器也可以负责提供您的日期。

        总而言之,模型视图控制器设计模式并不要求拥有一组嵌套的模型、视图和控制器。它们可能是,并且足够复杂的项目可能需要它。不过,从广义上讲,您将拥有一个与模型和一个或多个视图相关联的控制器,并且该组对象协同工作以提供一种功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-13
          • 2011-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-08
          相关资源
          最近更新 更多