質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

3222閲覧

OSXアプリでメニューバーの制御方法について

misakiti

総合スコア15

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2017/07/21 22:20

MacOSXアプリでメニューバー(MainMenu)の制御を行いたいと思っています。
以下のような制御をしたい場合、どのように記述すれば良いのか分からなかったので、もし分かる方がいましたら教えていただければと思います。

イメージ説明

現在、上記画面のようにViewControllerとViewController2という
2つの画面があります。
MainMenuにはOpenFormというメニューがあり、このOpenFormを
選択するとViewController2の画面が開くようなプログラムになります。

ViewControllerにはButton1とButton2があり、Button1を押すとMainMenuのOpenFormを有効化(Enabled)にし、Button2を押すと
MainMenuのOpenFormを無効化(クリックできないように)したいと考えております。

環境はXcode7.2、Swift2となります。
どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

swift2では以下の方法で実現する事ができました。

事前にIBにてMainMenuの「Auto Enables Items」のチェックを外しておく。

@IBAction func btnAction1(sender: AnyObject) { // Button1押下時(メニュー有効化) let myItem = NSApplication.sharedApplication().mainMenu?.itemAtIndex(0)?.submenu?.itemAtIndex(0) myItem!.enabled = true } @IBAction func btnAction2(sender: AnyObject) { // Button2押下時(メニュー無効化) let myItem = NSApplication.sharedApplication().mainMenu?.itemAtIndex(0)?.submenu?.itemAtIndex(0) myItem!.enabled = false }

投稿2017/07/22 23:19

編集2017/07/24 00:58
misakiti

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

やり方は色々あると思いますが一般的/汎用的なものを紹介します。

Swift3から始めたのでSwift2はわかりません。エラーなどでたら適宜書き替えてください

まず、OpenFormメニューアイテムにtagを設定します。一意的なものにしてください。
今回は85216を設定したとしましょう。

ViewControllerにいくつかの処理を追加します

  • Bool型変数 openFormEnabled の追加
  • Button1, Button2のアクションの追加
  • validateMenuItem(menuItem:)のオーバーライド

各アクションはストーリーボードで接続してください。

追加部分のみ記載します

swift

1 2class ViewController: NSViewController { 3 4 private var openFormEnabled: Bool = false 5 6 // Button1のアクション 7 @IBAction func enableOpenForm(sender: AnyObject?) { 8 openFormEnabled = true 9 } 10 11 // Button2のアクション 12 @IBAction func disableOpenForm(sender: AnyObject?) { 13 openFormEnabled = false 14 } 15 16 // これは必須ではありませんが、こうすることでエンバグの可能性を減らせます。 17 private enum MenuItemTag: Int { 18 case openForm = 85216 19 } 20 21 override func validateMenuItem(menuItem: NSMenuItem) -> Bool { 22 23 if let tag = MenuItemTag(rawValue: menuItem.tag) { 24 switch tag { 25 case .openForm: return openFormEnabled 26 } 27 } 28 29 // 単純にこれでもいいです 30// if menuItem.tag == 85216 { 31// return openFormEnabled 32// } 33 34 return false 35 } 36}

全体的な処理の流れ
0. Button1がクリックされたらopenFormEnabledをtrueにする
0. Button2がクリックされたらopenFormEnabledをfalseにする
0. openFormEnabledに応じてメニューアイテムの有効/無効を変更する

投稿2017/07/22 04:20

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misakiti

2017/07/22 23:15

この度はご回答いただきありがとうございました。 ただ、swiftのバージョンによるものなのか、こちらで設定に不備があるのかわかりませんが、validateMenuItemが呼ばれず、「OpenForm」のメニューを試用不可にできませんでした。こちらでもswift3にバージョンアップ後に改めて確認させていただければと思います。
MasakiHori

2017/07/23 04:12

すみません よく考えるとこの方法ではうまくいきません Swiftのバージョンは関係ないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問