Objective c Mac开发构建基本接口

Objective c Mac开发构建基本接口,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在浏览几个示例代码库和教程,但完全是结结巴巴的,很多都是因为这些教程是为Xcode

我正在浏览几个示例代码库和教程,但完全是结结巴巴的,很多都是因为这些教程是为Xcode<4.2编写的,而ARC对一些东西做了一些更改

我正在尝试用MVC设计模式构建一个接口。我正在使用为应用程序代表提供的基本模板。我添加了一个名为MainWindowController的类,它继承自NSWindowController。在Interface Builder中,首先我删除了Main菜单nib文件中的Window对象(因为我希望它位于单独的文件中)。我创建了一个名为MainWindow(.xib)的新接口,我将文件所有者更改为MainWindowController,我将委托添加到对象列表中。现在,有些东西没有点击

我没有完全掌握如何或需要实现什么,以便委托基本上加载和启动窗口控制器。首先,我尝试将窗口中“delegate”的出口链接到实际的应用程序委托(称为AppDelegate),然后将delegate类中的窗口出口链接到Interface Builder中的窗口

我希望得到答案,但如果有正确的文档描述这个过程,我会更高兴。我肯定MacDev上有东西,但我找不到

以下是我的工作内容:

  @class MainWindow;

  @interface AppDelegate : NSObject <NSApplicationDelegate>


  @property (strong) MainWindow *mainWindowController;
  @property (assign) IBOutlet NSWindow *window;

  @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
  @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

  - (IBAction)saveAction:(id)sender;

  @end
迄今为止的解决办法:

@synthesize mainWindowController = _mainWindowController; // IBOutlet is linked in IB
//...
- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    //... initialization of event handling etc...
    if ( !_mainWindowController ) _mainWindowController = [[ MainWindowController alloc] initWithWindowNibName:@"MainWindow"];
    [_mainWindowController showWindow: self];
    // ...
应用程序委托可以管理主nib文件中的NSWindow,也可以将该任务委托给控制器(NSWindowController),这是典型的基于文档的应用程序或MVC设计模式。Basic-info.plist指定的默认nib文件定义加载哪个nib文件。通常,默认nib应该是主菜单,主菜单也会加载代理。然后,委托人应通过ApplicationIDFinishLoading:或awakeFromNib:执行控制器的初始化,并根据委托和mvc设计模式继续适当的委托


我遇到的主要问题是启动窗口,这是由showWindow完成的:。这个问题的恶化源于一个非常旧的MacOSX项目的源代码,该项目使用了不推荐的函数和方法来完成委托,并将我引向了错误的道路。感谢您的回答,它最终让我在正确的位置寻找正确的问题,我找到了正确的答案。

您的问题是,在第二个xib“MainWindow”中,正在创建一个新的
AppDelegate
对象,它与“MainMenu”xib中的
AppDelegate
对象完全无关。每个xib中的对象都是真正的对象,它们被序列化,然后在运行时加载

此特定问题将在《资源管理指南》中讨论。我也可以建议

@synthesize mainWindowController = _mainWindowController; // IBOutlet is linked in IB
//...
- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    //... initialization of event handling etc...
    if ( !_mainWindowController ) _mainWindowController = [[ MainWindowController alloc] initWithWindowNibName:@"MainWindow"];
    [_mainWindowController showWindow: self];
    // ...