web-dev-qa-db-ja.com

Mac OSでモーダルスライドアウトウィンドウを作成する方法

これらのスクリーンショットのようにXCodeでモーダルスライドアウトウィンドウ/ビュー「インウィンドウ」を作成するにはどうすればよいですか?

「認証パネルスタイル」アニメーションを使用して新しいウィンドウコントローラーを作成しようとしましたが、XCodeのクラッシュのみを受け取ります。

modal window

21
Vasily

この種のモーダルウィンドウは、シートと呼ばれます。 Storyboardセグエを使用して、またはプログラムでNSViewControllerサブクラスを使用して、この動作を取得するのは非常に簡単です。以下の例は、Xcodeによって作成された空のOS X Cocoaアプリケーションです。 (言語としてSwiftを選択しましたが、Objective-Cでも同じように機能します。)

ストーリーボードに追加したのは、シートビュー用の2番目のView Controllerと、各ビューのラベルと押しボタンだけです。

ストーリーボードセグエでシートビューを表示する

シートビューコントローラーを選択し、[接続インスペクター]タブを表示した状態で、[Presenting Segues-sheet]を[Display Sheet]ボタンに接続します。

enter image description here

「受信したアクション-dismissController:」を「シートを閉じる」ボタンに接続します。

enter image description here

それでおしまい!この例を機能させるために必要なコードはありません。ビルドして実行するだけです。


プログラムによるシートビューの表示

Xcodeは、2つのカスタムクラスファイルでデフォルトのプロジェクトを作成することに注意してください。ストーリーボードでは、AppDelegate.Swiftがアプリケーションシーンに表示されます。

enter image description here

この例ではAppDelegateを使用する必要はありませんが、メインメニューなどの操作に使用できます。

カスタムViewController.Swiftカスタムクラスは、シートの表示に使用されます。 View Controllerシーンに表示されます:

enter image description here


プログラムでSheet View Controllerをインスタンス化するには、ストーリーボードIDが必要です。ここでは、IDに「SheetViewController」を付けます。プレーンなNSViewControllerのままであることに注意してください。この例ではカスタムクラスにする必要はありませんが、アプリケーションで次のことが必要になる場合があります。

enter image description here


ViewController.Swiftファイルをアシスタントエディターで表示し、Ctrlキーを押しながら「Display Sheet」ボタンからカスタムクラスに接続をドラッグします。これにより、「displaySheet」という名前の@IBAction関数のスタブコードが作成されます。

enter image description here

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

72
ElmerCat

Objective-Cバージョン:

- (IBAction)displaySheet:(id)sender {
    NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
    NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
    [self presentViewControllerAsSheet:vc];}
3
HaiderSahib