当前位置:  开发笔记 > 编程语言 > 正文

访问Model类中的Controller数据成员

如何解决《访问Model类中的Controller数据成员》经验,为你挑选了1个好方法。

我正在使用Xcode开发GUI应用程序.我有一个模型类和一个控制器类.我的控制器类中有一个NSTextView数据成员.如何从模型类访问此变量?



1> Mecki..:

首先,模型类不应与视图类通信.TextView是视图的一部分.

alt text http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/Art/cocoa_mvc.gif

控制器会查看类和视图类,为控制器提供反馈.模型类由控制器更新并向其提供反馈.模型类从不与视图类通信,它们甚至不知道任何视图类的存在.所以我认为你有一个基本的设计问题.你可能在这个模型中实现了MVC:

alt text http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/Art/traditional_mvc.gif

然而,这不是在Mac OS X中完成的方式,这不是Apple的方式,这不是整个Cocoa对象结构的设计方式!所以你的问题的答案是:你没有,因为你不应该.

除了事实,你有一个设计缺陷,你可以像访问Objective-C中的所有数据成员一样访问它.如果是公开的,您可以直接访问它:

MyController * c = [[MyController alloc] init];
// c has a member name textView, let's access it
[c->textView ...];

你应该已经知道,这实际上是非常糟糕的编程风格.您不应直接访问其他对象的数据成员.你实际上甚至不应该公开它们.如果您将它们声明为私有,则上面的代码将失败(编译器会强制您不执行此操作).另一种方法是实现一个getter并通过getter访问它:

// This goes into the controller

- (NSTextView) textView
{
    return textView;
}

// This is called in the modell

[[c textView] ...];

但是,这也是糟糕的设计.该模型可能会对此对象执行任何操作,您的控制器将无法看到它!你为什么不建模只是告诉控制器它想要发生什么?

// In the controller

- (void) notifyContentHasChanged:(NSString *)name
{
    // update the text view here ...
}

// In the modell

[c notifyContentHasChanged:...];

瞧,你有MVC就像Apple想要的那样.该模型仅通知控制器发生了什么,控制器相应地更新视图.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有