bugfix> c++ > 投稿

プラグインレベルからC ++アプリケーションからmacOSのモーダルダイアログを開く必要があります-既存のウィンドウやハンドルなどにアクセスできません(アプリケーションはQTで記述されています)。したがって、基本的には、ウィンドウを作成して表示し、ダイアログを閉じた後に続行する必要があるハンドラーがあります。

どうすればいいですか?

Xcodeでxib/nib(Window.nib)ファイルを作成し、プラグインバンドルのResourcesフォルダーに含めてから、これを呼び出しました(* .mmファイルにコンパイル):

NSWindowController * windowController = 
    [[NSWindowController alloc] initWithWindowNibName:@"Window"];
[[NSApplication sharedApplication] runModalForWindow: 
    windowController.window];

しかし、2行目は失敗しているようです。おそらく、UIスレッドで実行していませんか?他に私が試すことができるポインターはありますか?

回答 1 件
  • まず、次のようなコードで新しいウィンドウを作成してみてください。プログラムでCocoaウィンドウを作成するにはどうすればよいですか?

    そして、すべてのコードをラップしてメインスレッドで実行します。

    これは私のために働いた:

    MyDialog(NSWindowController)
    @interface MyDialog : NSWindowController
    - (instancetype)initWithFrame:(NSRect)frame;
    - (void)runModal;
    @end
    @implementation MyDialog
    - (instancetype)initWithFrame:(NSRect)frame {
        NSWindowStyleMask windowMask = NSWindowStyleMaskTitled
            | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable;
        NSWindow *window = [[NSWindow alloc] initWithContentRect:frame
                                                       styleMask:windowMask
                                                         backing:NSBackingStoreBuffered
                                                           defer:NO];
        [NSNotificationCenter.defaultCenter addObserver:self
                                               selector:@selector(windowWillClose:)
                                                   name:NSWindowWillCloseNotification
                                                 object:nil];
        return [super initWithWindow:window];
    }
    - (void)dealloc {
        [NSNotificationCenter.defaultCenter removeObserver:self];
    }
    - (void)runModal {
        [[NSApplication sharedApplication] runModalForWindow:self.window];
    }
    - (void)windowWillClose:(NSNotification *)notification {
        [[NSApplication sharedApplication] stopModal];
    }
    @end
    
    
    内部提示機能:
    [NSOperationQueue.mainQueue addOperationWithBlock:^{
        NSRect frame = NSMakeRect(0, 0, 200, 200);
        MyDialog *dialog = [[MyDialog alloc] initWithFrame:frame];
        [dialog runModal];
        NSLog(@"done");
    }];
    
    

    それが機能する場合、おそらくWindow.xibの助けを借りて同じ結果を得ることができますが、対応するWindow.nibファイル(コンパイルされたxib)が存在することを確認する必要があり、ランタイムでそれを見つけることができますプラグイン。このファイルをプラグインリソースのどこかに配置する場合、 initWithWindowNibPath: を使用できます。  フルパスを指定します。

あなたの答え