在我的应用程序中,已经自动创建了一个“关于我的应用程序”的菜单项,该菜单项将显示一个关于窗口。我该如何编辑此窗口?我想在那里添加一些额外的内容,但我找不到这个xib文件。
谢谢!
在我的应用程序中,已经自动创建了一个“关于我的应用程序”的菜单项,该菜单项将显示一个关于窗口。我该如何编辑此窗口?我想在那里添加一些额外的内容,但我找不到这个xib文件。
谢谢!
修改位于项目的“支持文件”组中的Credits.rtf
文件内容。
.xib
文件用于窗口(甚至可以通过编程方式加载)。@simon.d - 11684NSApp
中的图标图像)制作了一个演示项目:https://github.com/nicolas-miari/Cocoa-Custom-About-Window - Nicolas Miari- (instancetype) init {
if(self = [super initWithWindowNibName:@"AboutWindow" owner:self]){
// (other initialization...)
}
return self;
}
将 About 窗口的子视图连接到窗口控制器类中的 outlet。同时,将 File Owner 的类指定为自定义的 NSWindowController 子类,并将窗口的“New Referencing Outlet”连接到 File Owner 的 window
属性。
about:
方法。在你的应用委托中,添加一个实例变量来保存你的窗口控制器,这样它不会立即被释放(或者将窗口控制器类设计成单例并使用共享实例):
@implementation AppDelegate {
AboutWindowController *_aboutwindowController;
}
仍然在AppDelegate中,实现步骤3中已连接的about:
方法,如下所示:
- (IBAction)about:(id)sender {
if (_aboutwindowController == nil) {
_aboutwindowController = [AboutWindowController new];
}
[_aboutwindowController.window orderFront:self];
}
...或者,如果您的视图控制器实现为单例,像这样:
- (IBAction)about:(id)sender {
[[AboutWindowController defaultController].window orderFront:self];
}
最后,为了让您的窗口控制器能够正确地显示应用程序的信息,请从Info.plist文件中读取相关键,像这样(实际的出口ivars在您的情况下将不同):
- (void)windowDidLoad {
[super windowDidLoad];
// Implement this method to handle any initialization after your window
// controller's window has been loaded from its nib file.
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
self.appNameLabel.stringValue = [infoDictionary objectForKey:@"CFBundleName"];
self.appVersionLabel.stringValue = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
self.appCopyrightLabel.stringValue = [infoDictionary objectForKey:@"NSHumanReadableCopyright"];
}
你可能会想从捆绑的资源中读取应用程序图标,但有一种更优雅的方法,即使您没有指定图标并且被困在默认的“尺子+铅笔+刷子覆盖的纸张”应用程序图标中也可以使用:使用以下代码获取运行时图标图像:
self.appIconImageView.image = [NSApp applicationIconImage];
我在Github上制作了一个演示项目,展示了自定义关于窗口的功能和其他自定义选项。点击此处查看。
更新: 我已经在Github存储库中添加了一个Swift版本的演示项目。
它具有以下功能:
about:
方法。为了使其工作,该方法需要在 Swift 中具有 @IBOutlet func about(_ sender: Any)
的签名 (不要忘记参数名称前面的下划线!)。 - Nicolas Miari