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

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

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

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

最佳答案

如果您有一个控制特定窗口的控制器,那么绝对应该使用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声明为ivar:

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

关于macos - 我的新 Controller 应该是什么父类(super class)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8718764/

10-10 23:50