これらのスクリーンショットのようにXCodeでモーダルスライドアウトウィンドウ/ビュー「インウィンドウ」を作成するにはどうすればよいですか?
「認証パネルスタイル」アニメーションを使用して新しいウィンドウコントローラーを作成しようとしましたが、XCodeのクラッシュのみを受け取ります。
この種のモーダルウィンドウは、シートと呼ばれます。 Storyboardセグエを使用して、またはプログラムでNSViewController
サブクラスを使用して、この動作を取得するのは非常に簡単です。以下の例は、Xcodeによって作成された空のOS X Cocoaアプリケーションです。 (言語としてSwiftを選択しましたが、Objective-Cでも同じように機能します。)
ストーリーボードに追加したのは、シートビュー用の2番目のView Controllerと、各ビューのラベルと押しボタンだけです。
シートビューコントローラーを選択し、[接続インスペクター]タブを表示した状態で、[Presenting Segues-sheet]を[Display Sheet]ボタンに接続します。
「受信したアクション-dismissController:」を「シートを閉じる」ボタンに接続します。
それでおしまい!この例を機能させるために必要なコードはありません。ビルドして実行するだけです。
Xcodeは、2つのカスタムクラスファイルでデフォルトのプロジェクトを作成することに注意してください。ストーリーボードでは、AppDelegate.Swiftがアプリケーションシーンに表示されます。
この例ではAppDelegateを使用する必要はありませんが、メインメニューなどの操作に使用できます。
カスタムViewController.Swiftカスタムクラスは、シートの表示に使用されます。 View Controllerシーンに表示されます:
プログラムでSheet View Controllerをインスタンス化するには、ストーリーボードIDが必要です。ここでは、IDに「SheetViewController」を付けます。プレーンなNSViewController
のままであることに注意してください。この例ではカスタムクラスにする必要はありませんが、アプリケーションで次のことが必要になる場合があります。
ViewController.Swiftファイルをアシスタントエディターで表示し、Ctrlキーを押しながら「Display Sheet」ボタンからカスタムクラスに接続をドラッグします。これにより、「displaySheet」という名前の@IBAction関数のスタブコードが作成されます。
ViewController.Swiftファイルで、Sheet View Controllerを遅延変数として実装します。最初にアクセスされたときに一度だけインスタンス化されます。これは、displaySheet関数が最初に呼び出されたときに発生します。
// ViewController.Swift
import Cocoa
class ViewController: NSViewController {
lazy var sheetViewController: NSViewController = {
return self.storyboard!.instantiateControllerWithIdentifier("SheetViewController")
as! NSViewController
}()
@IBAction func displaySheet(sender: AnyObject) {
self.presentViewControllerAsSheet(sheetViewController)
}
}
Swift 4バージョン:
// ViewController.Swift
import Cocoa
class ViewController: NSViewController {
lazy var sheetViewController: NSViewController = {
return self.storyboard!.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "SheetViewController"))
as! NSViewController
}()
@IBAction func displaySheet(sender: AnyObject) {
self.presentViewControllerAsSheet(sheetViewController)
}
}
最初の例のように、「シートを閉じる」ボタンは、シートビューコントローラーの「dismissController:」アクションに接続されています。または、ViewControllerクラスからプログラムでその関数を呼び出すこともできます。
self.dismissController(sheetViewController)
詳細については、Apple「Sheets Programming Topics」ドキュメント: https://developer.Apple.com/library/content/documentation/Cocoa/Conceptual/Sheets/ Sheets.html
Objective-Cバージョン:
- (IBAction)displaySheet:(id)sender {
NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
[self presentViewControllerAsSheet:vc];}