如何访问从另一个类的nib文件加载的NSWindow的实例属性?

时间:2018-05-09 22:48:43

标签: objective-c macos cocoa

虽然我已经在Linux,BSD和Windows上进行了多年的编程,但我是Mac开发的新手,我想我不是'得到它' 当谈到Mac / Objective-C / Xcode开发模式时。

我在Interface Builder中创建了一个名为Window2的新窗口。此窗口是添加到MainMenu.xib的对象,不是单独的xib文件。

Window2上有几个控件,主要是文本字段和按钮。我已将这些控件作为IBOutlet属性连接到我的窗口控制器的.h文件中。我能够在实例本身中成功访问这些属性,但是我无法从另一个类或同一类中的类方法访问它们。

我考虑使用全局NSMutableDictionary来存储每个控件的指针,但这似乎是“hackish'”。互联网时间和Stack Overflow搜索没有提供任何有用的线索。

是否有某种方法可以满足良好的编程习惯,从类方法或其他类中访问Window2的实例属性?

我在macOS 10.13.4上使用Objective-C和Xcode 9.3。

Window2Controller.h

@interface Window2Controller

@property (weak) IBOutlet NSTextField * textHostName;

@end 

以下是我想要做的事情,可能不会使用代码:

OtherClass.m

#import "Window2Controller.h"

@implementation OtherClass

- (void)printTextHostNameValue
{
    NSString * txtHost = [Window2Controller textHostName] stringValue];
    NSLog(@"txtHost is: %@", txtHost);
}   

1 个答案:

答案 0 :(得分:0)

感谢Moritz的有用建议和咨询Apple文档,我找到了解决此问题的方法。我用[[NSApp keyWindow] delegate]找到了我的窗口委托,我可以访问它上面的IBOutlet属性。

<强> Window2Delegate.h

@interface Window2Controller

@property (weak) IBOutlet NSTextField * textHostName;

@end 

之后我的新窗口是关键:

<强> OtherClass.m

#import "Window2Controller.h"

@implementation OtherClass

- (void)printTextHostNameValue
{
    id del = [[NSApp keyWindow] delegate];
    NSString * hostText = [[del textHostName] stringValue];
    NSLog(@"hostText is: %@", hostText);
}  

@end