11

こんにちは、私はこの質問がすでに数回尋ねられているのを見てきましたが、まだ明確な答えがないので、xcode 7 と swift2 用に作成しました (とにかく少し変更された可能性があります)。

Xcode 7 と Cocoa OSX ストーリー ボード + swift2 を使用してプロジェクトを作成したので、プロジェクトはNSViewControllerに接続する NSWindowController から開始しました (予想どおり!)。ウィンドウ コントローラーに NSToolbar を追加、ツールバーにNSButtonを追加しました。NSViewController を、3 つのNSViewControllerにリンクする新しいNSSplitViewControllerの 1 つに変更し、それらのビューを水平に (垂直の仕切りで) 表示します (写真アプリや Yosemite + のページに表示されるレイアウトに似ています)。私の最終的な目標は、My ツールバーのボタンが最初の分割を表示および非表示にすることです。

それは私の理解であり、これを達成するには、自動レイアウトの制約を多かれ少なかれ変更するアクションを NSSplitViewController に作成する必要があると期待しています: How to do collapse and expand view in mac応用?.

そして、どういうわけか、このアクションをツールバーにある NSButton にリンクします...これはたまたま NSWindowController にあります(階層内ではるかに上にあり、分離されています)...

NSToolbar とストーリーボードに関する他の質問を既に行っており、目標を達成できませんでした:

  • YouTube ビデオ: Cocoa Programming L17 - NSToolbarは、問題を解決するために私が見つけた最も近いものですが、彼の方法はストーリーボードでは機能せず、独自の xib ファイルを作成するだけです。
  • この質問: How to use NSToolBar in Xcode 6 and Storyboard? ある人は、最初の応答者を使用してリンクを作成し、実行時にすべてが接続されることを期待することを提案しています (これは少し危険に見え、Apple が実装する方法ではないと思います...)。2 番目の人は、NSWindowController でビュー コントローラー変数を作成し、そこからそのプロパティを操作することを提案しましたが、これも少し危険です。

  • その質問で見た最新のコメントの 1 つは、問題に取り組むための最良の方法と思われる(しかし、私が推測するほど良くはありません) NSObjectController を各シーンのドックに追加し、シーンが読み込まれるときに値を設定することです。オブジェクトの他のシーンのコントローラーへ。これは本当に前進するための最良の方法ですか?もしそうなら、どうすればこれを達成できますか?

Apple は (再び) WWDC15 で、osx 用のストーリーボードとビュー コントローラーを所有する分割ビュー コントローラーを作成したことについて言及しました。これにより、ロジックを移動して特定のビュー コントローラーに作業できるようになります。これは、変更する必要があるターゲットであるため、分割ビューコントローラー内にあります。

View Controller自体からこれを達成する方法を知っている人はいますか? ToolBarItem をそれに接続する方法を本当に見つけることができませんでした。

4

4 に答える 4

3

OK、私はかなり前にこの質問を作成しましたが、これまでに回答がなかったので、問題を克服するために最近行ったことで回答しました。

Xcode プロジェクトを作成した後、次のようにしました。

  • NSSplitViewControllerのサブクラスMySplitViewControllerを作成しました
  • 各 NSSplitViewItem に IBOutlet を追加しました。例えば:

    @IBOutlet 弱い変数 mySplitViewItem: NSSplitViewItem!

  • NSWindowController のサブクラス WindowController を作成しました

  • NSToolbarItem (マイ ボタン) にリンクする WindowController クラスに IBAction を追加しました。
  • Window Controller のコンテンツをMySplitViewControllerとして取得するプロパティを追加しました

    var mySplitViewController: MySplitViewController { return self.window?.contentViewController as! MySplitViewController }

  • これで、作成したアクションで Window Controller から Split View Controller のプロパティにアクセスできるようになりました。

    mySplitViewController. mySplitViewItem.collapsed = true

これを行うサンプルコードをいくつか作成しました(ただし、誰かがこの動作で作業中のプロジェクトを見たい場合に備えて、ビューコントローラーを使用してここでラベルのテキストを変更します。それについてのブログ投稿も:)

于 2015-07-11T08:12:26.550 に答える
0

だから、私はこの同じ問題に取り組んでいましたが、あなたが経験したような解決策は見つかりませんでした. 私はあなたの投稿を読み、通知を使用することが思いついたときにあなたのソリューションをどのように実装するかを理解しようとしていました. 約 30 秒で、完全に機能するソリューションが完成しました。

windowController に IBAction を追加して、そのように通知を投稿します

-(IBAction)toggleMasterViewClicked:(id)sender
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:nil];
}

そのアクションを にNSToolbarItem接続し、viewController でその通知のオブザーバーとして self を追加します

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toggleMasterView:) name:@"TestNotification" object:nil];

あなたの場合、セレクターはupdateMyLabelText

ここには欠点がまったく見られません。他のオブジェクトへの参照は必要なく、依存関係もありません。私にとって完璧に動作します

于 2016-02-07T00:49:02.113 に答える