2012-01-03 55 views
2

我是内部程序的开发人员,用于建模充液壳的谐波和其他特性。现在,整个程序假定在计算中一次只能使用一组物理属性(温度,压力等)。我已经把所有的计算都打破了Sphere模型。我有一个拥有球体的控制器。当用户更改物理属性时,控制器会重新计算所有内容并更新显示球体计算结果的所有窗口。什么应该是我的新控制器的超类?

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

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

不确定这个问题,但解决方案必须在OS X 10.5下运行,因为我们组织中仍然有一些G5机器。

回答

2

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

除非新窗口中的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]; 
    } 
} 
+0

新窗口中的球体显示与其他所有窗口不同的数据集,因此它需要自己的球体模型。我很欣赏有关使用NSWindowController子类的信息。 – SSteve 2012-01-03 23:10:21

+0

一般来说,如果你正在管理一个窗口,你应该使用'NSWindowController'。使用窗口控制器作为该窗口中显示的模型的模型控制器也是非常有意义的。 – 2012-01-04 00:34:44

相关问题