14

Xcode 6 で Swift と Storyboard を使用する Cocoa アプリを構築しようとしていますが、そこでどのように使用できますNSToolbarか?

Xcode 5 および xib では、NSToolbarオブジェクト ライブラリ内から任意の .xib ファイルに追加し、追加されたツールバーをクリックして展開し、そこにある項目からAppDelegate.hファイルへの接続をドラッグ アンド ドロップできます。このようにして、IBActionorIBOutlet接続を作成できます。これは、Xcode 6 で Swift と非ストーリーボードを使用する場合にも実行できることを確認しました。ただし、Xcode 6 と Storyboard 環境ではそうではないようです。

最初に Xcode 6 で Storyboard を使用するプロジェクトを作成しましたが、その後、NSToolbarObject Library 内から Storyboard の View Controller に を追加できませんでした。そこで、ストーリーボードの Window Controller の Window オブジェクトに追加しました。ただし、この方法では、展開されたツールバーのアイテムからまたはいずれかへの接続を作成できませAppDelegate.swiftViewController.swift

だから私の質問は:

  • を使用するストーリーボード アプリを作成することは可能NSToolbarですか?
  • 可能であればNSToolbar、ウィンドウ コントローラーへの追加はNSToolBar、ストーリーボードで使用する適切な方法ですか?
  • @IBOutlet最後に、そこに@IBAction接続を作成するにはどうすればよいですか?

アップデート

@GeorgeVillasboas によって受け入れられた回答は、@IBAction. 私はまだ@IBOutlet接続を作成する方法を探しています...

4

6 に答える 6

27

私はこれとまったく同じ問題を抱えていました。このソリューションは、Objective-C プロジェクトと Swift プロジェクトの両方で機能します。

OSXでストーリーボードを操作すると、NSWindowのインスタンスが作成され、説明したように、ウィンドウコンテンツセグエとして別のNSViewControllerにセグエされます。

ViewController で、標準の IBAction を作成して、ツールバーがクリックされたときにアクションを受け取ります。NSToolbar と接続するには、下の図に示すように、NSToolbarItem から FirstResponder オブジェクトまで、Ctrl キーを押しながらドラッグ (または leftClick キーを押しながらドラッグ) します。

XCode 6 で NSToolbar を配線する

これにより、利用可能な接続の巨大なリストが開きます。あなたの IBAction はそのリストに載っています。それを選択しただけで、準備完了です。

お役に立てれば!

于 2014-07-17T18:04:44.960 に答える
11

これは、ランタイムフックアップに依存しない回答です-@cdalvaroの回答は、一部のアプリケーションではほとんどの方法で取得できますが、完全ではなく、 ViewController が人工的な について知る必要がありますがNSWindowController、これはありません気分がいい。

@cdalvaro のように、最初のステップは の独自のサブクラスを作成しNSWindowController、ストーリーボード WC をそのクラスに設定することです。その後、新しい WindowController で( s とs のNSToolbar両方)との間のすべての接続を作成できます。ここまでは順調ですね。@IBOutlet@IBAction

他のどこにも見たことのない最後のステップは、WindowController で ViewController を参照する方法です。@IBOutlet最初にここに来たのと同じ理由で、ViewController を作成することはできません。ストーリーボードのシーン間で参照を作成します。ただし、WindowController には ViewController への参照が必要です。self.window!.contentViewController! as! ViewController

これは、ViewController が何も知らなくても、 ViewController に値を設定するチェックボックスを備えた完全な WindowControllerです ...

class MyWindowController: NSWindowController {

    var viewController: ViewController {
        get {
            return self.window!.contentViewController! as! ViewController
        }
    }

    @IBOutlet weak var aSwitch: NSButton!
    @IBAction func toolbarActionA(sender: AnyObject) {
        println("toolbarActionA")
        self.viewController.a = !self.viewController.a
        self.aSwitch.state = self.viewController.a ? NSOnState : NSOffState
    }
}
于 2015-04-09T18:35:39.250 に答える
-1

IBOutlets の同じ問題が KVO にも当てはまります。NSSplitViewController の機能の 1 つは、KVO をサポートする各分割ビュー アイテムの canCollapse プロパティですが、これは IBOutlets と同様に IB では使用できません。

私が見ることができる唯一の回避策は、各シーンに NSObjectController を追加し、シーンが読み込まれるときに、オブジェクト コントローラーのオブジェクトを、参照する他のシーン (既に読み込まれている) のオブジェクトに設定することです。

于 2015-02-20T07:54:55.030 に答える