【问题标题】:window, view and subviews creation - mac os x窗口、视图和子视图创建 - mac os x
【发布时间】:2012-04-23 19:12:25
【问题描述】:

我是一名 Objective-C/Cocoa 新手,我想知道您能否为我提供一些关于我正在编写的第一个 Mac OS X 桌面应用程序的指南。

模型部分是自组织映射算法,SOM (Kohonen, 1982)。

从界面的角度来看,这个想法是有一个包含 1024x768 父视图和 192 个 64x64 正方形(子视图)的主窗口。子视图的颜色会随着 SOM 算法的运行而改变。构建 SOM 后,用户将能够通过单击某个方格来收听映射到某个方格的声音。

SOM 算法已经实现,但我很难创建接口并将其连接到模型部分。

我想用下面的代码来创建窗口:

NSRect windowRect = NSMakeRect(0.0f, 0.0f, 1024.0f, 790.0f);

NSWindow *window = [[NSWindow alloc] initWithContentRect:windowRect 
                                               styleMask:( NSResizableWindowMask |         NSClosableWindowMask | NSTitledWindowMask) 
                                                 backing:NSBackingStoreBuffered defer:NO];

[window setBackgroundColor:[NSColor blueColor]];    

[window makeKeyAndOrderFront:nil];

然后我将创建主视图添加主视图作为我窗口内容视图的子视图:

 NSView *view = [[NSView alloc] init]; 

 [window setContentView: view]

最后,我将创建子视图并将它们添加为父视图的子视图:

 for(int i=0;i<12;i++)
 {
    for(int j=0;j<16;j++)
    {
       NSView *child = [[NSView alloc]initWithFrame:CGRectMake(64*i,64*j,64, 64)];
       [view addSubview:child];
    }
 }

我的问题是:

1) 我的想法有意义吗?

2) 这些代码应该放在哪里?我仍然怀疑它们应该是 AppDelegate 还是 ViewController 的一部分?

3) 加载界面需要在main方法中添加什么?目前 main 方法只调用涉及音频处理和 SOM 算法的方法。我想这里的一般问题是如何连接模型和视图部分。

对于这些幼稚的问题,我深表歉意,并提前感谢您提出任何可以帮助我取得进展的想法。

谢谢。

【问题讨论】:

    标签: objective-c macos model-view-controller


    【解决方案1】:

    Cocoa 视图有点贵。 Apple 不鼓励大量使用它们。 192正在推动它。此外,如果视图只是彩色矩形,则为此使用整个视图对象毫无意义。只需定义一个自定义视图,在其中绘制彩色方块并处理点击。

    另外,您不需要分配标准NSView 并将其设置为窗口的内容视图。窗口以标准NSView 作为内容视图开始。您通常仅在以下情况下设置内容视图:a)它不是标准的 NSView(某种子类)或 b)它已经设置了子视图的层次结构并且您想要将其换入。

    关于您的问题 3,我想说您需要遵循 Cocoa 应用程序的标准设计。 main() 函数应遵循新 Cocoa 应用程序项目提供的模板。它通常应该只调用NSApplicationMain()。然后,添加自定义代码的好地方是应用程序委托的 -applicationDidFinishLaunching: 方法。 (我不知道您是否认为您的应用程序是基于文档的。如果是这样,那么设计会有所不同。您将定义您的文档类和文档窗口,框架将负责打开一个新的在启动时。)

    【讨论】:

    • 感谢您的回答。假设我只有 6 个子视图而不是 192 个。 parentView 会是窗口的 contentView 吗?一个 NSViewController 是否足以管理子视图的实例化?
    • 如果你喜欢,那么,当然,你可以在窗口内容视图中添加 6 个子视图。 NSViewController 通常管理一个视图,它可能是层次结构的根。如果您要将网格视图封装到单独的 NIB 中,那么拥有一个视图控制器并加载该 NIB 是有意义的。如果您的网格几乎是一次性的,只能与一个窗口一起使用,那么您可以只使用一个窗口控制器来控制窗口内的所有内容。
    猜你喜欢
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2017-11-08
    相关资源
    最近更新 更多