macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

worksWhenModal

INDEX>AppKit>NSWindow

モーダルで動いているウインドウがある場合、キーボードイベントやマウスイベントを受け取ることができるかどうか

Objective-C

@property(readonly) BOOL worksWhenModal

Swift

var worksWhenModal: Bool { get }

解説

他にモーダルで動いているウインドウがある場合、キーボードイベントやマウスイベントを受け取ることができるかどうか
このメソッドのNSWindowの実装はNOを返します。
NSPanelのサブクラスだけがオーバーライドできます。

tureの場合、他のウインドウがモーダルでもキーウインドウになることができる。(文字入力やボタンを押すことができる)

YouTube

falseの場合、キーウインドウにはなれない。

false - YouTube

設定値

Objective-C

@property(readonly) BOOL worksWhenModal

Swift

var worksWhenModal: Bool { get }

モーダルかYES/NO

フレームワーク

ApplicationKit

クラス

NSWindow

使用可能

10.0

参照

- setWorksWhenModal:(NSPanel)

setWorksWhenModal: - Cocoa API解説(iOS/OS X)

関連記事(外部リンク)


How Modal Windows Work



objective c - Modal Window in Cocoa - Stack Overflow

#12187 (Child window on modal dialog in Cocoa) – wxWidgets

例文

Objective-C

#import "Controller.h"

@implementation Controller

- (IBAction)pushButton:(id)sender
{
	 if ([myWindow worksWhenModal]){
		NSLog(@"worksWhenModal YES");
	 } else{
		NSLog(@"worksWhenModal NO");
	 }
    
}
@end

Swift

//NSWindow worksWhenModal
    //windowがモーダルでも、panelに文字入力ができる
    //サブクラスのworksWhenModal() で trueを返しているから
    func abortTimer(timer:NSTimer!) {
        NSLog("abort modal")
        let anApplication = NSApplication.sharedApplication()
        var p :MyPanel = timer.userInfo?.objectForKey("panel") as MyPanel
        if (p.worksWhenModal){
            NSLog("panel worksWhenModal YES")
        }else{
            NSLog("panel worksWhenModal NO")
        }
        NSLog("%@",p.title!)
        p.orderOut(self)
        
        //modal stop
        anApplication.abortModal()
    }
    @IBAction func function005(sender: AnyObject) {
        
        var panel : MyPanel = MyPanel(
            contentRect: NSMakeRect(0.0, 0.0, 300, 200),
            styleMask:  NSTitledWindowMask |
                NSClosableWindowMask |
                NSMiniaturizableWindowMask |
            NSResizableWindowMask,
            backing: .Buffered,
            defer: false)
        windowArray.addObject(panel) //ウインドウを保持するための配列に追加。アプリ終了時に配列は破棄
        panel.center()//ウインドウをスクリーンの中心に
        panel.title = "ウインドウタイトル"//タイトル設定
        //text field
        var textField : NSTextField = NSTextField(frame: NSMakeRect(50.0, 50.0, 100.0, 30.0))
        panel.contentView.addSubview(textField)
        panel.orderFront(self)//前面に
        //タイマー
        var timer = NSTimer.scheduledTimerWithTimeInterval(30.0, target: self, selector: Selector("abortTimer:"), userInfo: ["panel":panel], repeats: false)
        
        //タイマー、モーダルに入るとタイマーが動かなくなるので、ランループに追加する
        NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)


        
        
        let anApplication = NSApplication.sharedApplication()
        //モーダル開始
        var result:NSModalResponse = anApplication.runModalForWindow(window)
        

    }

NSPanelのサブクラスworksWhenModalでtrueを返す

class MyPanel: NSPanel {
    func worksWhenModal() ->Bool{
        
        //windowがモーダルでも、panelに文字入力ができる
        //サブクラスのworksWhenModal() で trueを返しているから
        return true 
    }

    
}

編集時のバージョン

10.10