私はストーリーボードでOS Xアプリを開発しています。カスタムViewControllerを持つ匿名ウィンドウ上のエントリポイントを持つPreview.storyboardを取得します。 AppDelegateクラスでは、次の関数を取得します。別のストーリーボードで新しいウィンドウを開く
func newPreviewWindow(sender: AnyObject) {
let storyboard = NSStoryboard.init(name: "Preview", bundle: nil)
let initialController = storyboard.instantiateInitialController()
initialController!.showWindow(nil)
initialController!.makeKeyAndOrderFront(nil)
}
、窓のショーをコードを実行しているが、私は次の例外を取得する場合:例外メッセージに基づいて
2016-08-11 10:27:12.434 MyApp[1090:290439] -[NSWindowController makeKeyAndOrderFront:]: unrecognized selector sent to instance 0x60000008c350
2016-08-11 10:27:12.434 MyApp[1090:290439] -[NSWindowController makeKeyAndOrderFront:]: unrecognized selector sent to instance 0x60000008c350
2016-08-11 10:27:12.440 MyApp[1090:290439] (
0 CoreFoundation 0x00007fff926284f2 __exceptionPreprocess + 178
1 libobjc.A.dylib 0x00007fff97c0ef7e objc_exception_throw + 48
2 CoreFoundation 0x00007fff926921ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00007fff92598571 ___forwarding___ + 1009
4 CoreFoundation 0x00007fff925980f8 _CF_forwarding_prep_0 + 120
5 MyApp 0x0000000100005617
...
をし、GoogleとStackOverflowの上で検索し、私はmakeKeyAndOrderFront
にセレクタを送信しようとしました
func newPreviewWindow(sender: AnyObject) {
let storyboard = NSStoryboard.init(name: "Preview", bundle: nil)
let initialController = storyboard.instantiateInitialController()
let selector = #selector(AppDelegate.newPreviewWindow(_:))
initialController!.showWindow(nil)
initialController!.makeKeyAndOrderFront(selector) // [A]
}
しかし、その後、私はライン上で以下のコンパイルエラーを取得[A]:このように機能Cannot call value of non-function type '((AnyObject?) -> Void)!'
新しいウィンドウを開く、またはセレクタを渡す適切な方法は?
ありがとうございます!それはNSWindow
(したがって認識されないセレクター誤差)に属する - makeKeyAndOrderFront:
がNSWindowController
方法ないので:)
どうもありがとう!それは例外とコンパイルの両方のエラーを修正するようです。残念ながら、ウィンドウは全く表示されません(例外は 'initialController!.makeKeyAndOrderFront(nil)'にスローされたときにどのように表示されていたか不思議です)。私は 'windowController.showWindow(nil)'と 'windowController.window!.makeKeyAndOrderFront(nil)'の両方を行い、何も起こりません。どうしてアイデアが出てくるのですか? –
あなたが投稿したコードでは '' initialController''はローカル変数です。他のローカル変数と同様に、それを作成した関数が終了するとすぐに(ウィンドウとともに)失われます。言い換えれば、ウィンドウ**は**表示されますが、関数が実行されるまでは表示されません。これはとても素早く起こり、何も起こらないように見えます。クラッシュするコードでは、クラッシュにはおそらく関数の実行が一時停止またはフリーズされるという影響があります。その結果、関数は決して戻りません。そして、ウィンドウコントローラーは、ウィンドウを画面上に保持するために残っています。解決策は、コントローラをプロパティに割り当てることです。 –
ありがとうございます!それは今、完璧に動作し、私はまだ私のJavaの背景のために理解していない2つの重要な概念を把握してきました!どうもありがとう!! –