2

Я являюсь разработчиком собственной программы моделирования гармоник и других свойств заполненных жидкостью оболочек. Сейчас вся программа предполагает, что в расчетах используется только один набор физических свойств (температура, давление и т. Д.). Я уже разбил все вычисления на модель Sphere. У меня есть контроллер, которому принадлежит сфера. Когда пользователь меняет физические свойства, контроллер имеет шар, который пересчитывает все и обновляет все окна, отображающие результаты вычислений сферы.Какой должен быть суперкласс моего нового контроллера?

Теперь кто-то попросил меня составить таблицу, отображающую частоты определенной гармоники в диапазоне температур и давлений. Я думаю, что это потребует нового контроллера, который имеет свою собственную сферную модель, потому что он должен быть независим от всех других окон.

Вот мой вопрос: должен ли мой новый контроллер быть подклассом NSWindowController или должен быть подклассом NSObject со свойством NSWindow, текстовые поля которого привязаны к значениям в контроллере (или что-то совершенно другое)? Я единственный разработчик в компании, и я изучил Cocoa самостоятельно, когда писал эту программу за последние четыре года, поэтому я не уверен, что всегда придерживался лучших практик. Поскольку я собираюсь представить новую значительную функциональность, я хотел бы убедиться, что я делаю это правильно.

Не уверен, что это имеет значение, но решение должно запускаться под OS X 10.5, потому что у нас все еще есть некоторые машины G5 в организации.

ответ

2

Если у вас есть контроллер, который управляет определенным окном, то вам обязательно следует использовать подкласс NSWindowController, хотя бы потому, что NSWindowController обрабатывает некоторые из более сложных задач по загрузке и управлению памятью.

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

Что-то вроде этого:

.h:

#import <Cocoa/Cocoa.h> 

@class Sphere; 

@interface FrequenciesController : NSWindowController 
{ 
    Sphere* sphere; 
} 
- (id)initWithSphere:(Sphere*)aSphere; 
@end 

.m:

#import "FrequenciesController.h" 
#import "Sphere.h" 

@implementation FrequenciesController 
- (id)initWithSphere:(Sphere*)aSphere 
{ 
    self = [super initWithWindowNibName:@"NameOfYourNib"]; 
    if (self) 
    { 
     sphere = [aSphere retain]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [sphere release]; 
    [super dealloc]; 
} 
@end 

Чтобы создать окно, то вы просто должны делать что-то вроде этого в главном контроллере , предположив, что вы заявили frequenciesController в качестве ivar:

- (IBAction)showFrequenciesWindow:(id)sender 
{ 
    if(!frequenciesController) 
    { 
     frequenciesController = [[FrequenciesController alloc] initWithSphere:self.sphere]; 
     [frequenciesController showWindow:self]; 
    } 
} 
+0

Сфера в новом окне показывает другой набор данных, чем все остальные окна, поэтому для этого потребуется собственная сфера. Я ценю информацию об использовании подкласса NSWindowController. – SSteve

+0

Как правило, если вы управляете окном, вы должны использовать 'NSWindowController'. Имеет смысл использовать оконный контроллер в качестве контроллера модели для модели, отображаемой в этом окне. –

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