用“showWindow”调用的窗口没有聚焦

时间:2013-06-12 23:29:49

标签: objective-c cocoa focus showwindow

我有一个简单的可可coredata状态栏应用程序与Xcode 4.6.2。情况就是这样:

MainMenu.xib重命名为PreferencesWindow.xib,删除了主菜单,在窗口中创建了一个简单且有效的coredata函数,其中包含arraycontrollers和bindings。 我创建了一个新文件 - >用户界面 - >主菜单并将其命名为StatusBarMenu.xib。添加了一个简单的菜单并删除了主菜单。 创建了NSObject的新文件> objective-c class->子类,并将其命名为StatusBarController。 这是界面的代码:

@property IBOutlet NSMenu *statusMenu;
@property NSStatusItem *statusItem;
@property [some items for statusbar image]

实现:

@synthesize [everything]
-(void)awakeFromNib{
    statusItem = [[NSStatusBar systemStatusBar]statusItemWithLength:NSVariableStatusItemLength];
    [some string, path and stuff for the images]
    statusItem.menu = statusMenu;
    statusItem.toolTip = @"";
    statusItem.highlightMode = YES;
}

然后我创建了另一个新文件 - > objective-c class-> NSWindowController的子类,将其命名为PreferencesWindowController并保持原样。 然后是一个名为PreferencesAppController的新文件 - > objective-c class-> NSObjects的子类。这是.h的代码:

@property (assign) IBOutlet NSWindow *mainWindow;
@property (retain) PreferencesWindowController *prefController;
-(IBAction)showPreferences:(id)sender;

.m代码:

@synthesize [everything];
-(IBAction)showPreferences:(id)sender{
    if(!self.prefController)
        self.prefController = [[PreferencesWindowController alloc] initWithWindowNibName:@"PreferencesWindow"];

    [self.prefController showWindow:sender];
}

AppDelegate文件中,只有coredata的代码,没有添加任何内容。 然后在PreferencesWindow.xib我为NSObject添加了PreferencesAppController(蓝色多维数据集),其中包含一些绑定:Outlets-> mainWindow使用简单的coredata函数绑定到窗口。 AppDelegate将窗口出口绑定到同一窗口,然后引用Outlets->文件的所有者委托,一些saveactionmanagedobjectcontext。 在StatusBarMenu.xib我创建了一个StatusBarController对象并将其绑定到菜单(outlets->statusMenu),创建了另一个名为PreferencesAppController的蓝色对象,其中已绑定Actions->showPreferences个绑定菜单项。

然后我运行该程序,一切顺利:状态栏中出现一个图标,下拉菜单工作,如果我点击“偏好...”,首选项窗口会出现但是......它没有聚焦!它位于其他窗口的顶部,但我必须单击以使其集中。 coredata保存功能工作正常,除了我必须用按钮手动保存,退出状态栏菜单中的应用程序不保存,但这是一个边际问题。

为什么窗口没有聚焦?

1 个答案:

答案 0 :(得分:1)

我假设你的应用程序描述为“状态栏应用程序”,它意味着在后台运行而不会显示在Dock中。

这意味着您的应用程序不是活动应用程序。用户单击您的状态项并从其菜单中选择一个项目不会改变它。

当不是活动应用程序的应用程序打开一个窗口时,该窗口不会成为焦点(因为这通常相当于从用户在 的应用程序中执行的操作中窃取焦点活性)。

所以,你需要activate your application