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

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

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

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

Swift

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

Q&A

1回答

817閲覧

NSSavePanelの使い方

taylor

総合スコア37

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/10/13 03:38

編集2017/10/13 03:40

###前提・実現したいこと
Xcode9からプロジェクトがデフォルトでSandboxとなったのでしょうか、これまでできていた外部へのファイル書き出しができなくなり、色々調べた結果NSSavePanelを利用することにしました。が、うまく機能しません(ダイアログが開かない)。

初歩的で申し訳ありませんが、よろしくおねがいします。

###発生している問題・エラーメッセージ
Playgroundだとなんとか成功しますが、実装しようとするとエラーになります(ダイアログが開かない)。
また、Playgroundでも書き出せてはいるものの謎のメッセージが表示されています。

//Cocoa appで実装した際のエラー(長すぎるので抜粋) ImportFile[1225:60723] warning: <NSRemoteView: 0x608000121c20> determined it was necessary to configure <NSVBSavePanel: 0x101119300> to support remote view vibrancy 2017-10-13 12:20:20.149855+0900 ImportFile[1225:60723] -[NSVBSavePanel init] caught non-fatal NSObjectNotAvailableException 'service com.apple.appkit.xpc.openAndSavePanelService failed to init an instance of NSSavePanelService on behalf of <NSRemoteView: 0x608000121c20> due to { ...
//Playgroundで実行した際に表示されるメッセージ(全文) Oct 13 12:24:32 [942] <Error>: CGContextSetFillColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Oct 13 12:24:32 [942] <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Oct 13 12:24:32 [942] <Error>: CGContextGetCompositeOperation: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Oct 13 12:24:32 [942] <Error>: CGContextSetCompositeOperation: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Oct 13 12:24:32 [942] <Error>: CGContextFillRects: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. Oct 13 12:24:32 [942] <Error>: CGContextSetCompositeOperation: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

Playgroundで表示されているメッセージは調べたらどうやらGUI関係のもののようで、なぜここでそういうエラーがでるのか全くわからずお手上げです...
###該当のソースコード

let savePanel = NSSavePanel() savePanel.runModal() if let url = savePanel.url{ let text:String = "書き出し内容" do { try text.write( to: url, atomically: false, encoding: String.Encoding.utf8 ) } catch { print(error) } }

###試したこと
NSOpenPanelも実装したのですが、こちらはうまくいっています。
NSSavePanelに関しては以下のページを参考にトライしてみましたが、ダメでした。
http://bricho-swift.blogspot.jp/2016/03/os-x.html
https://qiita.com/hanamiju/items/d10524e8650ae171fa2e
https://qiita.com/takecian/items/d31682899768f89a8d80

Appleの公式ドキュメントもトライしてみたのですが、ハードルが高かったです...
https://developer.apple.com/documentation/appkit/nssavepanel#//apple_ref/occ/cl/NSSavePanel

###補足情報(言語/FW/ツール等のバージョンなど)
Swift4, Xcode9.0, macOS Sierra 10.12.6

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

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

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

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

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

MasakiHori

2017/10/13 06:18

Playgroundではイベントループが回ってないのでGUIの表示は無理なのでは?
taylor

2017/10/13 11:21 編集

回答ありがとうございます!Playground(Blank)で上記のコードを実行すると一応ダイアログはでて、保存もできます。ただご指摘の確認のためNSOpenPanelもPlaygroundで実行してみたところ、空のダイアログが出てしまいうまくいきませんでした。(GUIの表示とはこのことであってますでしょうか?)
guest

回答1

0

すでに解決されているかもしれませんが、念のため。

自分もmacOSのアプリを初めて作って引っかかりました。

TARGETSのCapabilities / App Sandbox / File Access / User Selected File のPermission & Accessを、Read Only → Read/Write に変更してやったら(App SandboxのボタンがOFFになる)保存のウィンドウが表示されるようになり、保存することができました。
イメージ説明

投稿2018/04/17 15:24

Galakuta09

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問