Cocoa:从另一个类触发NSWindow makeKeyAndOrderFront实例方法

时间:2017-07-17 09:16:30

标签: objective-c cocoa

关于窗口外观的 - 或 - 关于传递参数,但能够调用 makeKeyAndOrderFront 实例方法通过代码(IB接收器操作工作正常,窗口实现块中的方法也是如此),来自 另一个 类。

我明白这应该是微不足道的,而且我没有正确掌握消息传递结构或正确地做我的声明,但我已经开始绕圈子了,SO和其他博客和论坛上的很多问题都没有已经足够接近这种确切的方式来帮助我点击我出错的地方。

虽然我已经尝试了很多东西,但这(虽然不正确)可能是显示我 尝试 做什么的最明显的尝试:

NSWindow SubClass

@interface hTaskWindow
- (id)initWithContentRect:// etc...

- (IBAction)hWindowActivate:(id)sender;

// ...
@end 
@implementation hTaskWindow

- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag {

    self = [super initWithContentRect:contentRect styleMask:NSFullSizeContentViewWindowMask backing:NSBackingStoreBuffered defer:NO];

    [self setTitle:titlename];
    [self setStyleMask:[self styleMask] | //


// 
// Plus a bunch  
// of style
// customisations here
//
// "Visible at launch" is Unticked on this Window.
// 
//

-(void)activateDebugWindow {   //       <---------  I just want to call this from anywhere!
    NSLog(@"This works fine when triggered from IB button");
    [self makeKeyAndOrderFront:self];
}

-(IBAction)hWindowActivate:(id)sender { 
    [self activateDebugWindow]; 
}
@end

NSObject子类:

@interface AppController : NSObject {
}
@end

@implementation AppController

// whole bunch of working stuff ...
    NSLog(@"This logs fine when I press my global hotkey");

    hTaskWindow *hwindow;                                      // Nothing happens
    [hwindow makeKeyAndOrderFront:(hwindow)];                  // Here at all

    NSLog(@"This logs fine when I press my global hotkey");
// whole bunch of working stuff ...
@end

目标是从另一个类以编程方式打开hTaskWindow

  • 我有一个带有热键的菜单快捷键,直接连接到窗口控制器上的接收器操作makeKeyAndOrderFront打开窗口

  • NSButton与[{1}}相关联,打开窗口

  • 我有一个全球热键,可以成功记录 NSLog

  • 中的条目

但我要做的是让我的全局热键方法激活在另一个类中打开窗口的函数。

从IBAction调用的当前不必要的hWindowActivate只是尝试设置一个点,其中XIB 一段代码可以打开同一个窗口。

2 个答案:

答案 0 :(得分:1)

在调用makeKeyAndOrderFront:之前,您必须加载要显示的窗口。它是通过NSWindowController完成的。

更改这些行

hTaskWindow *hwindow;
[hwindow makeKeyAndOrderFront:(hwindow)];

hTaskWindow *hwindow = [[hTaskWindow alloc] init]; // initialize window here
NSWindowController *windowController = [[NSWindowController alloc] initWithWindow:hwindow];
[windowController.window makeKeyAndOrderFront:self];

如果您的窗口是从.xib文件加载的,则应使用initWithWindowNibName:方法初始化窗口控制器。

答案 1 :(得分:1)

@style/PreferenceThemeOverlay.v14.Material应该位于应用的xib中。在应用委托中添加插座以连接到hTaskWindowhTaskWindow应该在app委托中。您可以使用hWindowActivate从任何地方激活窗口。

[[NSApp delegate] hWindowActivate:sender]

将IB中的菜单项和按钮连接到应用代表或第一响应者和-(IBAction)hWindowActivate:(id)sender { [self.hTaskWindow makeKeyAndOrderFront:sender]; }