2012-01-03 42 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

相關問題