gpt4 book ai didi

objective-c - 访问模型类中的 Controller 数据成员

转载 作者:行者123 更新时间:2023-12-03 16:23:38 25 4
gpt4 key购买 nike

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

最佳答案

首先,模型类不应与 View 类对话。 TextView 是 View 的一部分。

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

Controller 与 View 类对话, View 类向 Controller 提供反馈。模型类由 Controller 更新并向其提供反馈。模型类从不与 View 类对话,它们甚至不知道任何 View 类的存在。所以我认为你这里有一个基本的设计问题。您可能按照此模型实现了 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 ...];

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

// This goes into the controller

- (NSTextView) textView
{
return textView;
}

// This is called in the modell

[[c textView] ...];

但是,这也是一个糟糕的设计。模型可能会对这个对象做任何它想做的事情,而你的 Controller 不会看到它!为什么你的模型不直接告诉 Controller 它想要发生什么?

// In the controller

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

// In the modell

[c notifyContentHasChanged:...];

瞧,您已经拥有了 Apple 希望的 MVC。模型仅通知 Controller 发生了什么, Controller 相应地更新 View 。

关于objective-c - 访问模型类中的 Controller 数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/301233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com