Каким должен быть суперкласс моего нового контроллера? - PullRequest
2 голосов
/ 04 января 2012

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

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

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

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

1 Ответ

2 голосов
/ 04 января 2012

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

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

Примерно так:

.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 в качестве ивара:

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