【问题标题】:What should be the superclass of my new controller?我的新控制器的超类应该是什么?
【发布时间】:2012-01-03 21:18:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: macos cocoa model-view-controller cocoa-design-patterns


    【解决方案1】:

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

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

    【讨论】:

    • 新窗口中的球体显示的数据集与所有其他窗口不同,因此它需要自己的球体模型。我很欣赏有关使用 NSWindowController 子类的信息。
    • 一般来说,如果你正在管理一个窗口,你应该使用NSWindowController。将窗口控制器用作该窗口中显示的模型的模型控制器也是非常有意义的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多