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

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

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

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

MacOS(OSX)

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

Q&A

解決済

1回答

5946閲覧

SwiftUIでMac用のアプリを作成しているが、別ウィンドウ表示方法はわかるが、閉じるとエラーが発生する。

haduki

総合スコア7

Cocoa

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

MacOS(OSX)

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

0グッド

0クリップ

投稿2020/05/01 06:01

編集2020/05/01 08:42

前提・実現したいこと

MacOS用Appを作成していて、ボタンを押すと別のウィンドウが表示され、
新しいウィンドウ上のボタンを押すと閉じるような物を作成したい。

新規ウィンドウ表示はできているが、新規ウィンドウを閉じるとエラーが発生する。

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

Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)

このメッセージは、AppDelegate.swiftに表示されます。
閉じる以外は問題なく、また、閉じるButtonでもウィンドウ右上の×ボタンを押しても発生します。
また、ウィンドウ下部デバッグコンソールには、ウィンドウが閉じるタイミングで、下記表示が現れます。

(lldb)

該当のソースコード

swift

1import Cocoa 2import SwiftUI 3 4struct ContentView: View { 5 var body: some View { 6 Button(action: {newWindow()}){ 7 Text("NewWindow") 8 } 9 } 10} 11 12func newWindow() { 13 var window: NSWindow! 14 let newview = newView() 15 16 window = NSWindow( 17 contentRect: NSRect(x: 0, y: 0, width: 480, height: 300), 18 styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], 19 backing: .buffered, defer: false) 20 window.center() 21 window.contentView = NSHostingView(rootView: newview) 22 window.makeKeyAndOrderFront(nil) 23} 24 25struct newView: View { 26 var body: some View { 27 Button(action:{NSApplication.shared.keyWindow?.close()}){Text("Close")} 28 } 29}

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

Xcode 11.4
Mac OS 10.15
Swift 5.2

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

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

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

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

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

MasakiHori

2020/05/01 07:20

ウインドウ下部のコンソールに表示されるエラーすべてを質問に追記してください
haduki

2020/05/01 07:52

指摘ありがとうございます。 非常に無学で申し訳ないのですが、 ウィンドウ下部のエラーすべてとは、 2020-05-01 16:49:01.124522+0900 qwetest[8275:330136] Metal API Validation Enabled (lldb) のことでしょうか?
guest

回答1

0

自己解決

いろいろ試したところ、下記の方法で上手く行きましたので、報告します。

swift

1import Cocoa 2import SwiftUI 3 4struct ContentView: View { 5 @State var window:NSWindow? 6 @State var windowCont:NSWindowController? 7 let newview = newView() 8 var body: some View { 9 VStack{ 10 Button(action: { 11 self.newWindow() 12 13 }){ 14 Text("NewWindow") 15 } 16 } 17 } 18 19 func newWindow(){ 20 self.window = NSWindow(contentRect: NSMakeRect(0, 0, 480, 300),styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], backing: NSWindow.BackingStoreType.buffered, defer: false) 21 self.window!.title = "new window" 22 self.window!.isOpaque = false 23 self.window!.center() 24 self.window!.contentView = NSHostingView(rootView: self.newview) 25 self.window!.isMovableByWindowBackground = true 26 self.window!.makeKeyAndOrderFront(nil) 27 28 self.windowCont = NSWindowController(window:self.window) 29 } 30} 31 32 33struct newView: View { 34 var body: some View { 35 Button(action:{ 36 NSApplication.shared.keyWindow?.close() 37 }){Text("Close")} 38 } 39}

投稿2020/05/04 02:55

haduki

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問