如何使用 xib 文件正确实现 NSWindowController 子类

Posted

技术标签:

【中文标题】如何使用 xib 文件正确实现 NSWindowController 子类【英文标题】:How to correctly implement a NSWindowController subclass with xib-file 【发布时间】:2014-01-30 09:28:27 【问题描述】:

我正在尝试使用新的 xib 文件实现 NSWindowController 子类,我阅读了很多书籍,并对 *** 进行了研究,但是提供的步骤都没有显示我的窗口,也没有执行子类代码。新的 xib 文件的 File's Owner 设置为“LogNavigatorController”,并且已建立到窗口及其内容的连接。

我的 AppDelegate.h:

#import <Cocoa/Cocoa.h>

@class LogNavigatorWindowController;

@interface AppDelegate : NSObject <NSApplicationDelegate>

    LogNavigatorWindowController *logsWindowController;


@end

我的 AppDelegate.m:

#import "AppDelegate.h"
#import "LogNavigatorWindowController.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    // Insert code here to initialize your application

    logsWindowController = [[LogNavigatorWindowController alloc] initWithWindowNibName:@"LogNavigatorWindowController"];
    [logsWindowController showWindow:self];


@end

我的 LogNavigatorWindowController.h:

#import <Cocoa/Cocoa.h>

@interface LogNavigatorWindowController : NSWindowController

    NSArray *directoryList1;
    NSArray *directoryList2;
    NSMutableArray *directoryList;
    NSMutableArray *filePaths1;
    NSMutableArray *filePaths2;


@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTableView *logsTableView;
@property (unsafe_unretained) IBOutlet NSTextView *logsTextView;
@property (assign) IBOutlet NSArrayController *LogListController;
@property (retain) NSMutableArray *logsArray;

- (void) myDirectoryLogFunction;

@end

我的 LogNavigatorController.m:

#import "LogNavigatorWindowController.h"

@interface LogNavigatorWindowController ()

@end

@implementation LogNavigatorWindowController

@synthesize logsTableView;
@synthesize logsTextView;
@synthesize window;

- (id)init

    self = [super initWithWindowNibName:@"LogNavigatorWindowController"];
    [self loadWindow];
    [self showWindow:@"Log Navigator"];
    [self.window makeKeyAndOrderFront:nil];

    if (self)
    
        // Initialization code here.
        [self myDirectoryLogFunction];
    

    return self;


- (void)windowDidLoad

    [super windowDidLoad];

    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.


- (void) myDirectoryLogFunction

    NSLog(@"Code execution test successful");


@end

【问题讨论】:

NSWindowController 已经有一个 window “属性”,所以我怀疑你自己提供是问题所在。 感谢@***foe 删除了属性及其实现代码(合成),仍然没有骰子。 【参考方案1】:

您不需要创建 window 属性,因为它已经可用于 NSWindowController 子类。也许这会导致问题。

此外,您的 init 方法包含许多不属于那里的代码。删除

[self loadWindow];
[self showWindow:@"Log Navigator"];
[self.window makeKeyAndOrderFront:nil];

以及替换

self = [super initWithWindowNibName:@"LogNavigatorWindowController"];

self = [super init];

您可能想要完全删除 init 方法,因为您不需要它。

移动

[self myDirectoryLogFunction];

到 windowDidLoad 方法。

还要检查是否调用了用于实例化窗口控制器的代码(在您的情况下来自应用程序委托 didFinishLaunching: )。有时,如果您在原始项目中进行了太多更改并且意外删除了委托连接或类似情况,那么创建一个新项目并在那里进行测试会有所帮助。

【讨论】:

谢谢@Volker 现在做了所有这些,但是子类代码仍然没有被执行,窗口也不会显示。 我怀疑它与 AppDelegate 类有关,因为它应该调用 NSWindowController 子类,当我阅读它时,它的代码并没有被执行。跨度> 当您在 AppDelegate 的 initWithWindowNibName 调用中使用 XIB 名称时,您是否检查过它是否正确? 如果您使用 ARC,您可能希望在 .h 文件中将 LogNavigatorWindowController 声明为 @property(强)并通过 self.logsWindowController 访问它 现在将其声明为财产。是的,它设置为“LogNavigatorWindowController”。另外我刚刚分析了一下,似乎 AppDelegate 类代码没有被执行(通过设置断点)。

以上是关于如何使用 xib 文件正确实现 NSWindowController 子类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xib 文件正确创建自定义单元,注册并加载它?

如何在 MacOS 中正确显示 xib 文件的模态视图?

从xib加载视图的正确方法是啥?

从 XIB 加载的 UITableView Sectionheader 有时显示不正确

.xib 文件不在编译源构建阶段,但仍然可以正确构建;怎么会这样?

尝试加载 xib 文件时无法同时满足约束