Mac开发构建基本界面

时间:2011-12-15 19:34:43

标签: objective-c macos cocoa

我正在经历几个示例代码库和教程,并且完全绊脚石,其中很多是因为这些教程是为Xcode编写的。 4.2和ARC改变了一些事情。

我正在尝试使用MVC设计模式构建一个接口。我正在使用为Application Delegate提供的基本模板。我添加了一个名为MainWindowController的类,它继承自NSWindowController。在Interface Builder中,首先我删除了MainMenu nib文件中的Window对象(因为我希望它在一个单独的文件中)。我创建一个名为MainWindow(.xib)的新接口我将文件所有者更改为MainWindowController我将Delegate添加到Object List。现在在这一点上没有点击。

我没有完全掌握我需要实现的方式或内容,以便委托基本上加载和启动Window Controller。首先,我尝试将Window中“委托”的插座链接到实际的应用程序委托(称为AppDelegate),然后将Delegate类中的Window Outlet链接到Interface Builder中的Window。

我想对此作出答案,但我会对描述此过程的正确文档感到高兴。我确定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

...

  @implementation AppDelegate

  @synthesize window;
  @synthesize mainWindowController;
  @synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
  @synthesize managedObjectModel = __managedObjectModel;
  @synthesize managedObjectContext = __managedObjectContext;

  - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
  {
      MainWindow *controller = [[MainWindow alloc] initWithWindowNibName:@"MainWindow"];
      mainWindowController = controller;

     // ... the rest handles the ManagedObject Models...

迄今为止的解决方案:

@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应该是主菜单,它也会加载委托。然后代理应该通过applicationDidFinishLoading:或awakeFromNib:执行控制器的初始化并根据委托和mvc设计模式继续适当的委派。

我遇到的主要问题是启动窗口,这是由showWindow完成的:。这个问题的恶化源于一个非常古老的Mac OS X项目的源代码,该项目使用不赞成使用的函数和方法来完成委派并导致我走上了错误的道路。谢谢你的答案,它最终让我找到了正确的问题,我找到了正确的答案。

1 个答案:

答案 0 :(得分:1)

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

此特定问题将在资源管理指南"Nib Loading"中解决。我也可以建议"Core Application Design"