Доступ к элементу данных Controller в классе Model - PullRequest
2 голосов
/ 19 ноября 2008

Я использую Xcode для разработки приложения с графическим интерфейсом. У меня есть класс модели и класс контроллера. У меня есть элемент данных NSTextView в моем классе контроллера. Как мне получить доступ к этой переменной из класса модели?

Ответы [ 2 ]

11 голосов
/ 19 ноября 2008

Прежде всего, модельный класс не должен общаться с классом представления. TextView является частью представления.

альтернативный текст http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/Art/cocoa_mvc.gif

Контроллер обращается к классам просмотра, а классы представления обеспечивают обратную связь с контроллером. Классы моделей обновляются контроллером и обеспечивают обратную связь с ним. Классы моделей никогда не общаются с классом представления, они даже не знают о существовании каких-либо классов представления. Поэтому я думаю, что у вас есть основная проблема дизайна здесь. Вы, вероятно, реализовали MVC как в этой модели:

альтернативный текст http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/Art/traditional_mvc.gif

Однако это не так, как это делается в Mac OS X, это не то, как Apple это делает, и это не способ, которым была разработана вся структура объекта Какао! Поэтому ответ на ваш вопрос таков: нет, потому что не следует.

Помимо того, что у вас есть недостаток дизайна, вы получаете к нему доступ так же, как и ко всем членам данных в Objective-C. Если оно общедоступное, вы можете получить к нему прямой доступ:

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

Вы уже должны знать, что это на самом деле очень плохой стиль программирования. Вы не должны получать доступ к данным членов другого объекта напрямую. Вы даже не должны делать их публичными. Если вы объявите их закрытыми, приведенный выше код потерпит неудачу (компилятор принудит вас этого не делать) Другой способ - реализовать геттер и получить к нему доступ через геттер:

// 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 хочет, чтобы это было. Модель только уведомляет контроллер о том, что происходит, и контроллер соответственно обновляет представление.

1 голос
/ 21 ноября 2008

Re: рекурсивная проблема #import, вам нужна директива @class. В большинстве случаев весь интерфейс вашего класса должен знать о других классах - это их имена, так как весь фактический материал, относящийся к реализации, находится в ваших *.m файлах. Таким образом, директива @class предоставляет определению интерфейса способ сказать компилятору: «Эй, когда вы встретите это слово, это имя класса, так что не волнуйтесь». Когда вы используете @class в объявлении интерфейса, вам не нужно импортировать заголовочный файл этого класса.

Язык программирования Objective-C 2.0: интерфейс класса (со ссылкой на другие классы) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...