2008-11-19 2 views
2

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

ответ

11

Прежде всего, класс модели не должен разговаривать с классом вида. 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, делает это, и это не так, как все какао структура объекта была разработана! Поэтому ответ на ваш вопрос: вы этого не сделаете, потому что не должны.

Помимо того, что у вас есть дефект дизайна, вы получаете доступ к нему, как и доступ ко всем членам данных в 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

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

The Objective-C 2.0 Programming Language: Class Interface (Referring to Other Classes).

Смежные вопросы