代码之家  ›  专栏  ›  技术社区  ›  Rits

将模型对象数组传递给视图对象的最佳(designwise)方法是什么?

  •  3
  • Rits  · 技术社区  · 15 年前

    我有一个BankAccount模型类,它包含诸如帐号、银行名称、事务等数据。事务是事务类的每个实例,包含在事务NSArray中。

    我还有一个BankAccountView,它在一个视图中显示所有这些。现在我把所有的数据作为单独的变量传递。bankAccountView.accountNumber帐户号= bankAccount.accountNumber帐户号, bankAccountView.bankName= bankAccount.bankName银行帐户).

    所以我现在要做的是:获取每个事务实例,将其转换为NSDictionary,然后设置bankAccountView.transactions一个包含那些字典的数组。它可以工作,我觉得它使我的模型和视图类保持分离,但它也感觉过于复杂,好像我在为一些可能更简单的事情编写大量代码。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Max Seelemann    15 年前

    我认为你已经走得太远了,应该通过整个考试 BankAccount

    我的论点:

    • 这使您的界面非常清晰,只需要一个属性: @property(...) BankAccount *bankAccount;
    • (编辑) 传递对象封装了所有属性之间的依赖关系。他们不是独立的,他们形成了一个银行账户。这应该是可见的。
    • 只有当视图独立于它显示的数据时,模型和视图之间才需要非常强大的划分。如果视图只能显示一种非常特定的数据类型:银行帐户,那么将其匿名化是没有意义的。

    如果不想直接传递该类,请设计一个协议,封装视图从银行帐户对象中需要的所有属性,并拥有该类 银行帐户 然而, 只有当您(计划)将不同类型的类作为数据传递给视图时,这才有意义。如此不同,以至于这些类不能共享一个具有所有这些属性的公共超类。如果只有这个简单类或继承类,请使用最简单的解决方案:直接传递帐户。

    为了能够触发对更改的重画,我建议您使用键值观察。这是一个非常干净的方式来保持匿名性和必须写很少的代码。在你的 init 方法对要观察的每个属性执行以下操作:

    [self addObserver:self forKeyPath:@"bankAccount.<property>" withOptions:0 context:@"redraw"];
    

    然后你实施 observeValueForKeyPath... :

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if (context == @"redraw") {
            [self setNeedsDisplay];
        } else {
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }
    }
    

    我发现这是一种非常干净的方法,开销非常小,我碰巧在自己的项目中大量使用了这种方法。

        2
  •  1
  •   jbrennan    15 年前

    只是一个范例,可以解释 )模型对视图一无所知,而视图对模型一无所知。它们不应该直接交互;严格地说,您的视图不应该有模型的实例。

    控制器 BankAccountView

    MyBankAccountViewController UIViewController 子类(子类) C级 在MVC中),其视图是 银行账户视图 BankAccount . 在适当的时候(例如 -viewDidLoad ),您将希望用视图中的信息填充视图(及其子视图) 型号( self.bankAccountView.accountNameLabel.text = self.myBankAccount.name

    MyBankAccountViewController

    [self.bankAccount closeBankAccount]; .

    正如我所说,这正是我解释MVC的方式(我严格而迂腐地看待它),它可能会使代码复杂化,而不仅仅是直接传递模型。如果您只打算在一个地方使用这个视图,而不打算重用它,那么直接传入可能会更简单。请记住,这样做的代价是使将来的重用更加困难(这是MVC的一个关键卖点:您的模型和视图应该是可重用的;您的控制器不会是可重用的)。

    推荐文章