0

好的,我做错了什么?
1.创建cocoa app和appDelegate命名:window2AppDelegate
2.window2AppDelegate.h

#import "PrefWindowController.h"
@interface window2AppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    PrefWindowController * ctrl;
}

@property (assign) IBOutlet NSWindow *window;
- (IBAction) buttonClick:(id)sender;
- (IBAction) buttonCloseClick:(id)sender;
@end


3. 在 xib 编辑器中,窗口连接到窗口控制器 - 设置为 appdelegate,buttonclick 动作到按钮
4,创建

#import <Cocoa/Cocoa.h>
@interface PrefWindowController : NSWindowController {
@private

}
@end

#import "PrefWindowController.h"
@implementation PrefWindowController

- (id)init {
    self = [super initWithWindowNibName: @"PrefWindow"];
    return self;
}

- (void)dealloc {
    // Clean-up code here.
    [super dealloc];
}

- (void)windowDidLoad {
    [super windowDidLoad];
    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

@end


5. 创建名为 PrefWindow 窗口 IBOutlet 的新 xib 文件,从其控制器连接到窗口(也将控制器设置为 PrefWindowController) 选项“启动时可见”未选中!我想在 buttonclick 上看到这个窗口。
6.实现window2AppDelegate

#import "window2AppDelegate.h"
@implementation window2AppDelegate
@synthesize window;

- (id) init {
    if ((self = [super init])) {
        ctrl = [[PrefWindowController alloc] init];
    if ([ctrl window] == nil)
        NSLog(@"Seems the window is nil!\n");
    }
    return self;
}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
    return YES;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
}

- (IBAction) buttonClick:(id)sender {
//    [[ctrl window] makeKeyAndOrderFront:self]; this doesn't work too :(
NSLog(@"it is here");
[ctrl showWindow:sender];
}

- (IBAction) buttonCloseClick:(id)sender {
    [window close];
}

@end


7. 在我构建并运行应用程序后:closebutton 关闭应用程序但 buttonclick - 不会显示 PrefWindow!?为什么和我做错了什么?不要告诉我在可可objective-c 中显示其他窗口比在“愚蠢的”Java 或C# 中更困难?

4

3 回答 3

1

终于我解决了这个问题!在 PrefWindow 的 nib 编辑器中,我必须执行以下操作:将 File's owner class 设置为: NSWindowController然后将 window IBOutlet from File's owner 连接到我的 (preferneces) window。经过 6 天的不成功尝试后,谷歌开始工作。
无论如何,感谢您的所有回复和时间!

于 2010-12-15T18:05:04.877 回答
0

I'd suggest you move the creation of the PrefWindowController to applicationDidFinishLaunching:

I am not sure the application delegate's init method is called. Probably only initWithCoder: gets called when unarchiving the object from the NIB.

于 2010-12-14T23:17:12.860 回答
0
- (id) init {
   if ((self = [super init])) {
      ctrl = [[PrefWindowController alloc] init];
   if ([ctrl window] == nil)
      NSLog(@"Seems the window is nil!\n");
   }
   return self;
}

init尝试测试 IBOutlets 的计划还为时过早。他们仍然是零。直到稍后在对象创建过程中,笔尖出口才会“连接起来”。您可以知道 nib 文件中的所有内容都已连接的标准方法是:

- (void)awakeFromNib {

}

那时,您的所有 IBOutlets 都应该是有效的(前提是它们不是故意引用一个单独的、尚未加载的 nib 中的对象)。

如果 PrefWindowController 是一个仅在用户从应用程序菜单中选择 Preferences后才会使用的类,我将不得不不同意其他人并说我在初始加载期间根本不会创建 PrefsWindowController 的实例。(您的主控制器应该能够独立于首选项窗口运行)。如果您有一个用于加载首选项窗口的方法,那么当调用该方法时,您应该检查 PrefsWindowController 实例是否为 nil,如果是,则创建它,然后继续显示首选项窗口。

于 2010-12-15T06:32:42.767 回答