2

我是一个内部程序的开发人员,用于对充液外壳的谐波和其他特性进行建模。现在,整个程序假设在计算中一次只使用一组物理属性(温度、压力等)。我已经将所有计算分解为一个球体模型。我有一个拥有球体的控制器。当用户更改物理属性时,控制器让球体重新计算所有内容并更新所有显示球体计算结果的窗口。

现在有人要求我制作一张表格,显示特定谐波在一定温度和压力范围内的频率。我认为这将需要一个具有自己球体模型的新控制器,因为它需要独立于所有其他窗口。

这是我的问题:我的新控制器应该是 NSWindowController 子类,还是应该是 NSObject 子类,其属性是 NSWindow,其文本字段绑定到控制器中的值(或完全不同的东西)?我是公司中唯一的开发人员,我在过去四年编写这个程序时自学了 Cocoa,所以我不确定我是否一直遵循最佳实践。由于我即将推出一项新的重要功能,我想确保我做对了。

不确定这是否重要,但该解决方案必须在 OS X 10.5 下运行,因为我们组织中仍有一些 G5 机器。

4

1 回答 1

2

如果您有一个控制特定窗口的控制器,那么您绝对应该使用NSWindowController子类,如果只是因为NSWindowController为您处理一些更复杂的 nib 加载和内存管理问题。

除非新窗口中的 Sphere 模型显示的数据集与主控制器中的不同,否则您不需要为新控制器创建新模型。您可以在主控制器中引用球体实例。

像这样的东西:

。H:

#import <Cocoa/Cocoa.h>

@class Sphere;

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

米:

#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];
    }
}
于 2012-01-03T22:48:09.827 回答