我有一个简单的可可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->文件的所有者委托,一些saveaction
和managedobjectcontext
。
在StatusBarMenu.xib
我创建了一个StatusBarController
对象并将其绑定到菜单(outlets->statusMenu
),创建了另一个名为PreferencesAppController
的蓝色对象,其中已绑定Actions->showPreferences
个绑定菜单项。
然后我运行该程序,一切顺利:状态栏中出现一个图标,下拉菜单工作,如果我点击“偏好...”,首选项窗口会出现但是......它没有聚焦!它位于其他窗口的顶部,但我必须单击以使其集中。 coredata保存功能工作正常,除了我必须用按钮手动保存,退出状态栏菜单中的应用程序不保存,但这是一个边际问题。
为什么窗口没有聚焦?
答案 0 :(得分:1)
我假设你的应用程序描述为“状态栏应用程序”,它意味着在后台运行而不会显示在Dock中。
这意味着您的应用程序不是活动应用程序。用户单击您的状态项并从其菜单中选择一个项目不会改变它。
当不是活动应用程序的应用程序打开一个窗口时,该窗口不会成为焦点(因为这通常相当于从用户在 的应用程序中执行的操作中窃取焦点活性)。
所以,你需要activate your application。