我最近在某些计算机上遇到了一个问题,其中NSBorderlessWindowMask
全屏窗口的创建将显示在主屏幕上,而不是screen.frame
我提供的。如果我用基本的窗口创建代码创建一个新的 Cocoa 程序,那么全屏窗口就会正确创建。但是,将原始程序的代码减少到工作最小程序的代码仍然会产生不正确的结果。
如果我然后通过在任何地方添加单个字符来更改捆绑标识符,那么也许从那时com.blah.Program
起com.blah.tProgram
程序可以正常工作。改回原来的包标识符,程序停止正常工作。
我删除了 的所有内容~/Library/Developer/Xcode/
,确保没有使用 保存的首选项defaults delete [bundle identifier]
,删除了 中带有应用程序名称的任何内容~/Library/
,然后重新启动计算机而行为没有改变。
所以总而言之,我有一个有问题的应用程序。我将代码减少到可以工作的最小代码,但仍然有问题。我更改了捆绑标识符,程序开始正常工作。我恢复了捆绑标识符,程序停止正常工作。
有问题的最小代码如下代替AppDelegate.m
新 Cocoa 程序的默认值,其中单个按钮绑定到选择器pushbutton:
#import "AppDelegate.h"
@interface AppDelegate () {
NSWindow *_fullScreenWindow;
}
@property (weak) IBOutlet NSWindow *window;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
- (IBAction)pushbutton:(id)sender {
[self fullScreenWindow];
}
- (void)fullScreenWindow {
NSArray *screens = [NSScreen screens];
NSScreen *screen = screens[1];
NSRect screenFrame = [screen frame];
NSRect frame = NSMakeRect(0,0,screenFrame.size.width,screenFrame.size.height);
NSWindow *window = [[NSWindow alloc] initWithContentRect:screenFrame
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:YES];
[window orderFront:nil];
[window setFrame:screenFrame display:YES animate:NO];
_fullScreenWindow = window;
}
@end
该代码实际上是无关紧要的,因为无论捆绑标识符如何,我都可以使用NSZeroRect
for来解决问题initWithContentRect:
,但是我想知道为什么捆绑标识符会导致给定代码出现此问题,以便我可以确定原始问题是否在某处我更大的代码,Cocoa API 中的一些东西,或者完全是外部的东西。
还有其他地方可以保存系统中的内容吗?其他程序是否可以使用我选择的捆绑标识符更改任何程序的行为,如果是,我将如何找到该程序?还有其他想法吗?
不确定它是否相关,但这与针对 OS X 10.10 的 Yosemite 10.10.2 上的 XCode 6.1.1 相关。