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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

MacOS(OSX)

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

Xcode

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

Swift

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

Q&A

解決済

2回答

3442閲覧

モーダルビューのタイトルバーおよびボタンの制御方法を知りたい

130an

総合スコア6

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

MacOS(OSX)

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

Xcode

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

Swift

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

1グッド

2クリップ

投稿2020/03/17 23:33

編集2020/03/18 00:11

前提・実現したいこと

Cocoaを使って、macOSアプリを作成しています。

メインウィンドウから、サブウィンドウ(ビュー?)をモーダルで表示させたのですが、
サブウィンドウのタイトルにUntitledと表示されてしまいます。
また、サブウィンドウ左上のClose/Minimize/Maximizeボタンも不要なのですが、
有効な状態で表示されてしまいます。

サブウィンドウのタイトルバーの非表示や表示文字の変更、
左上のClose/Minimize/Maximizeボタンの非表示や無効化はどのようにすれば制御できるのでしょうか。

初歩的な問題だと思いますが、
モーダルで表示したサブウィンドウのWindowControllerがどこで管理されているのかわからず、
苦戦しております。
お知恵をお貸しいただけますと幸いです。

発生している問題・エラーメッセージ

モーダルで表示したサブウィンドウのタイトルバーおよび ウィンドウ左上のClose/Minimize/Maximizeボタンを制御できない。

該当のソースコード

swift

1// メインウィンドウのViewController 2class ViewController: NSViewController { 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 7 // Do any additional setup after loading the view. 8 } 9 10 override var representedObject: Any? { 11 didSet { 12 // Update the view, if already loaded. 13 } 14 } 15 16 // View上のボタンを押下するとサブウィンドウをモーダル表示 17 @IBAction func btnDisplayModalAction(_ sender: NSButton) { 18 // サブウィンドウ(ビュー?)へ遷移 segueToModalViewはstoryboard上で設定したModalなSegue 19 performSegue(withIdentifier: "segueToModalView", sender: nil) 20 } 21 22 // サブウィンドウを表示する際にメインウィンドウを非表示 23 override func prepare(for segue: NSStoryboardSegue, sender: Any?) { 24 // メインウィンドウ非表示 25 let windows = NSApplication.shared.windows 26 let window = windows.first! // メインウィンドウ取得 27 window.orderOut(sender) 28 } 29 30}

試したこと

サブウィンドウのViewControllerで、自身のviewにsetAccessibilityTitle("aaa") → タイトル変わらず

補足情報(FW/ツールのバージョンなど)

swift 5.1.3

storyboardキャプチャ
storyboard

AtsushiYonenaga👍を押しています

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

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

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

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

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

guest

回答2

0

自己解決

サブウィンドウのViewControllerの**viewWillAppear()**にて、
生成されたWindowを取得して、タイトルバーおよびボタンを非表示にしました。

swift

1// ModalViewController 2 3 override func viewWillAppear() { 4 let windows = NSApplication.shared.windows 5 let window = windows.last! 6 window.styleMask = .fullSizeContentView 7 super.viewWillAppear() 8 }

投稿2020/03/18 02:34

130an

総合スコア6

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

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

0

これでしょうか。
イメージ説明


ウィンドウのタイトルは目的の ViewController の title プロパティで設定できます。
呼び出し側 ViewController の prepare(for segue:) で設定する場合:

Swift

1// ViewController 2 3 override func prepare(for segue: NSStoryboardSegue, sender: Any?) { 4 if let vc = segue.destinationController as? NSViewController { 5 vc.title = "New Window" 6 } 7 }

呼び出された ModalViewController で設定する場合

Swift

1// ModalViewController 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 self.title = "New Window" 6 }

それ以外の NSWindow の属性(タイトルバーを表示するか、など)については、NSWindow のコンストラクタ引数でしか設定できないようなので、私のスクリーンショットのように Storyboard で Window Controller を追加するか、自分で NSWindow を作る必要があるかと思います。

ちなみに、prepare(for segue:) の段階ではまだ Window も View も作られてないので、prepare(for segue:) で NSApplication.shared.windows を取得した場合は既存の main window のみが返るはずです。

投稿2020/03/17 23:54

編集2020/03/18 01:14
hoshi-takanori

総合スコア7899

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

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

130an

2020/03/18 00:12 編集

ご回答ありがとうございます。 storyboard上では、WindowController(Main)、ViewController(Main、Sub)となっており、 storyboardのWindowController(Main)のプロパティを変更しても、 ViewController(Sub)の表示には影響がありませんでした。 なお、現在は、WindowController(Main)のTitle Bar有りで、TitleにはMainWindowと設定しております。
130an

2020/03/18 02:30

詳細な回答ありがとうございます。 確認したところ、viewWillAppear()がコールされる段階で、 サブウィンドウのNSWindowが生成されているようでしたので、 viewWillAppear()にて、タイトルバーおよびボタンを非表示にしました。 ```swift override func viewWillAppear() { let windows = NSApplication.shared.windows let window = windows.last! window.styleMask = .fullSizeContentView super.viewWillAppear() } ``` 質問自体は解決したのですが、もう1点、もしご存じでしたらお教えいただきたいのですが、 今回のようにサブウィンドウを表示する場合の作り方としては、 サブウィンドウ用のWindowControllerを自分で明示的に作る方法(=storyboard上に配置してWindowControllerへ遷移させる)と、 サブウィンドウ用のWindowControllerを自分で明示的に作らずにフレームワークに作らせる方法(=storyboard上に配置せずにViewControllerへ遷移させる) のどちらが一般的なのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問