objective-c - Mac开发构建基本界面

标签 objective-c macos cocoa

我正在浏览几个示例代码库和教程,但完全陷入困境,很大程度上是因为这些教程是为 Xcode < 4.2 编写的,并且 ARC 更改了一些内容。

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

我不完全掌握如何或需要实现什么才能让委托(delegate)本质上加载和启动窗口 Controller 。首先,我尝试将 Window 中的“委托(delegate)”导出链接到实际的应用程序委托(delegate)(称为 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];
    // ...

应用程序委托(delegate)可以管理主 nib 文件中的 NSWindow,也可以将该任务委托(delegate)给 Controller (NSWindowController),这是典型的基于文档的应用程序或 MVC 设计模式。 Basic-info.plist 指定的默认 nib 文件定义了加载哪个 nib 文件。通常,默认 Nib 应该是主菜单,它也会加载委托(delegate)。然后,委托(delegate)应该通过 applicationDidFinishLoading: 或 awakeFromNib: 执行 Controller 的初始化,并根据委托(delegate)和 mvc 设计模式继续适当的委托(delegate)。

我遇到的主要问题是启动窗口,这是由 showWindow: 完成的。这个问题的加剧源于一个非常古老的 Mac OS X 项目的源代码,该项目使用已弃用的函数和方法来完成委托(delegate),并导致我走上了错误的道路。感谢您的回答,它最终让我在正确的位置寻找正确的问题,并找到了正确的答案。

最佳答案

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

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

关于objective-c - Mac开发构建基本界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8525605/

相关文章:

macos - 在 OSX 上安装 Ansible

c - 获取当前 pthread cpu 使用率 Mac OS X

ios - 是否有 GCD 等同于设置可以取消并在以后重新安排的计时器?

objective-c - 在 Cocoa for osx 中使用正则表达式进行用户输入验证

iphone - 如何重用 NSData 来读取多个大文件?

objective-c - 按字母顺序自动分组 UITableView

ios - 持久 HTTPS 连接 Objective-C iOS Cocoa

objective-c - NSTokenField 点击完成列表项

iphone - Cocoa 和 iPhone 开发之间的差异

ios - 按下相机按钮后,Frontback 应用程序会为其相机使用什么动画?