0

私は最近、一部のコンピューターで、フルスクリーン ウィンドウの作成が、提供するNSBorderlessWindowMask代わりにプライマリ スクリーンに表示されるという問題に遭遇しました。screen.frame基本的なウィンドウ作成コードを使用して新しい Cocoa プログラムを作成すると、フルスクリーン ウィンドウが正しく作成されます。ただし、元のプログラムのコードを作業用の最小限のプログラムのコードに縮小しても、依然として正しくない結果が生じます。

その後、どこかに 1 文字を追加してバンドル ID を変更するとcom.blah.Programcom.blah.tProgramプログラムは正常に動作します。元のバンドル ID に戻すと、プログラムが正しく動作しなくなります。

のすべてのコンテンツを削除~/Library/Developer/Xcode/し、 に設定が保存されていないことを確認defaults delete [bundle identifier]し、 内のアプリ名を含むものをすべて削除~/Library/し、コンピューターを再起動しましたが、動作に変化はありませんでした。

要約すると、問題のあるアプリケーションがありました。コードを作業用の最小限のコードに減らしましたが、まだ問題がありました。バンドル ID を変更したところ、プログラムが正しく動作するようになりました。バンドル ID を元に戻したら、プログラムが正しく動作しなくなりました。

問題の最小限のコードは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

NSZeroRectforを使用してバンドル識別子に関係なく問題を解決できるため、コードは正直に無関係ですが、バンドル識別子initWithContentRect:が指定されたコードでこの問題を引き起こしている理由を知りたいので、元の問題がどこかにあったかどうかを判断できます私のより大きなコード、Cocoa API の何か、または完全に外部の何か。

システムに何かが保存される可能性のある場所は他にありますか? 他のプログラムが、選択したバンドル識別子を持つプログラムの動作を変更している可能性がありますか?もしそうなら、どうすればこのプログラムを見つけることができますか? 他のアイデアはありますか?

関連するかどうかはわかりませんが、これは OS X 10.10 をターゲットとする Yosemite 10.10.2 上の XCode 6.1.1 にあります。

4

1 に答える 1

0

私が考えることができる唯一のことは、アプリケーションの Info.plist の Bundle Identifier です。おそらく、そのファイルを直接編集して、それがどうなるかを確認できます。

これには、plistbuddy を使用できます。

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/YourApplication.app/Contents/Info.plist

または、スクリプトでこれを使用します。

a=Finder; mdls -name kMDItemCFBundleIdentifier -raw "$(mdfind kMDItemContentType==com.apple.application-bundle | sed -E $'s|(.*/)(.*)|\\1\t\\2|' | grep -F $'\t'"$a".app -m1 | tr -d '\t')"

それがあなたのコードに関連していることを強く疑っています。何が原因なのかわかりません。

元のバンドル内の機能のプラグインとして Loadable バンドルを使用している場合、それが問題に影響している可能性があります。これをテストするために空のプロジェクトを実行しようとしたため、これは問題ではない可能性があります。まだ一見の価値があります。

すべてのリソースのリンクが正しく、見つかっているかどうかを確認してください。リンクがプロジェクトの一部の設定に予期しない影響を与える可能性があるインスタンスを見てきました。

別のプログラムが、選択したバンドル識別子の動作に影響を与えたり、変更したりする可能性はないと思います。唯一の例は、両方のバンドル識別子が密接に関連している場合です (それでもかなり驚くべきことです)。

これが問題についての助けや新しいアイデアを与えることができることを願っています.

于 2015-04-08T08:08:19.737 に答える