gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:43:42 26 4
gpt4 key购买 nike

我正在浏览几个示例代码库和教程,但完全陷入困境,很大程度上是因为这些教程是为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com