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

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

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

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

Swift

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

Q&A

1回答

522閲覧

[xcode]MACアプリ・画像保存のやり方について

minoossp

総合スコア42

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/12/05 15:09

編集2018/12/05 15:52

解決したいこと

画像を保存して保存したデータをボタンを押した時に呼び出す(読み込ませる)
方法がわかりません。

やったこと・ここまでしかわからないこと

@IBOutlet weak var screenImg: NSImageView! @IBAction func BtnImgPath(_ sender: Any) { //print("push") let dialog = NSOpenPanel() //ファイルを開くダイアログ dialog.canChooseDirectories=false // ディレクトリを選択できるか dialog.canChooseFiles = true // ファイルを選択できるか dialog.canCreateDirectories = false // ディレクトリを作成できるか dialog.allowsMultipleSelection = false // 複数ファイルの選択を許すか dialog.allowedFileTypes = NSImage.imageTypes // 選択できるファイル種別 dialog.begin { (result) -> Void in if result.rawValue == NSFileHandlingPanelOKButton {// ファイルを選択したか(OKを押したか) guard dialog.url != nil else { return } //log.info(url.absoluteString) // ここでファイルを読み込む self.screenImg.image = NSImage(contentsOf: dialog.url!) } } } //ここに画像保存 @IBAction func btn11(_ sender: Any) { } //ここに保存した画像を呼び出す @IBAction func btn12(_ sender: Any) { }

このコードでボタンを押したら選択した画像が表示するまではできたのですが
ここからがわかりません。
ご教授お願いします。
xcode:9.2
swift

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

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

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

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

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

MasakiHori

2018/12/06 01:01

何を求めているのかがわかりません。 画像が表示されたらそれでいいのではないのですか? そのあと何をしようとしているのですか?
minoossp

2018/12/07 01:57

説明が下手ですいません。ボタンを押すと一度選んだ画像を呼び出すようにしたいのですがどうしたらいいのかわかりません。
MasakiHori

2018/12/07 08:56

ごめんなさい。やっぱりわからないです。
minoossp

2018/12/07 16:06

申し訳ありません。今の状態はアプリを一度閉じてしますと選択していた画像が消えてしまう状態です。ボタンを押したら保存していた画像が表示されるようにしたいです。何度も申し訳ありません
MasakiHori

2018/12/11 23:44

1、ユーザーが選択した画像を表示する。 2、アプリを終了する。 3、起動時に1)の画像を表示する。 というとですか?
minoossp

2018/12/21 02:47

返事が遅くなりすいません。 それがしたいのですがわかりません。
guest

回答1

0

状態を永続化する

アプリケーションの再起動後もとの状態に戻せるようにすることを永続化とかいいます。

何を保存するか

今回は画像を再び表示させるようにしたいわけですが、保存すべき物を選択する余地が残されています。
元の状態に戻すために必要なものは
0. 画像自身
0. 画像のURL
0. 画像のAlias

のいづれかとなります。
いづれかを選びましょう。

どこに保存するか

一般的にはこのような場合は UserDefault を利用します。
ただし、画像のような大きなサイズのものはApplication Supportsディレクトリに保存するようにします。

UserDefaults

UserDefaultsはアプリケーションに必要な情報を保存するためにアプリケーションごとに用意された領域です。
ウインドウの位置やサイズ、テーブルビューの状態などを保存します。
辞書形式の領域なので取り扱いは簡単です。

取り出し(URLの場合)

swift

1let lastImageURLKey = "lastImageURLKey" 2 3// 保存されていなければnilが返る 4if let lastImageURL = UserDefaults.shared.url(forKey: lastImageURLKey) { 5 6 // 画像を読み込み 7}
保存(URLの場合)

swift

1let lastImageURLKey = "lastImageURLKey" 2 3UserDefaults.shared.set(imageURL, forKey: lastImageURLKey)

Application Supportsディレクトリ

慣習的にアプリケーションがその機能のために自由に使っていいとされてるディレクトリです。

保存場所の作成

Application Supportsディレクトリ内に自アプリケーション用のディレクトリを作成する必要があります。

swift

1private func supportDirName() -> String { 2 3 let main = Bundle.main 4 5 return main.bundleIdentifier 6 ?? main.infoDictionary?["CFBundleName"] as? String 7 ?? main.infoDictionary?["CFBundleExecutable"] as? String 8 ?? "UnknownAppliation" 9} 10 11private func searchedURL(for directory: FileManager.SearchPathDirectory) -> URL { 12 13 return FileManager.default.urls(for: directory, in: .userDomainMask) 14 .last 15 ?? URL(fileURLWithPath: NSHomeDirectory()) 16} 17 18private func createDirectory(_ url: URL) -> Bool { 19 20 do { 21 22 try FileManager.default.createDirectory(at: url, 23 withIntermediateDirectories: false, 24 attributes: nil) 25 26 return true 27 28 } catch { 29 30 return false 31 } 32} 33 34private func checkDirectory(_ url: URL, create: Bool) -> Bool { 35 36 do { 37 38 let resourceValue = try url.resourceValues(forKeys: [.isDirectoryKey]) 39 if !resourceValue.isDirectory! { 40 41 print("Expected a folder to store application data, found a file (url.path).") 42 43 return false 44 } 45 46 return true 47 48 } catch let error as NSError { 49 50 if create, error.code == NSFileReadNoSuchFileError { 51 52 return createDirectory(url) 53 } 54 55 return false 56 } 57} 58 59let supportURL = { 60 let url = searchedURL(for: .applicationSupportDirectory) 61 .appendingPathComponent(supportDirName()) 62 guard checkDirectory(url, create: true) else { 63 return FileManager.default.temporaryDirectory 64 } 65 return url 66}() 67
取り出し

swift

1let storedLastImageName = "StoredLastImage.jpg" 2 3let storedLastImageURL = supportURL.appendingPathComponent(storedLastImageName) 4 5let image = NSImage(contentsOf: storedLastImageURL)
保存

swift

1let storedLastImageName = "StoredLastImage.jpg" 2 3let storedLastImageURL = supportURL.appendingPathComponent(storedLastImageName) 4 5let originalURL // オリジナルのURL 6 7try? FileManager.default.removeItem(at: storedLastImageURL) 8try? FileManager.default.copyItem(at: originalURL, to: storedLastImageURL)

投稿2018/12/14 02:49

編集2018/12/14 06:48
MasakiHori

総合スコア3384

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問