前提・実現したいこと
SwiftとCocoaフレームワークを利用して、macOS向けのアプリケーションを開発しております。
ユーザが指定した絶対パスに格納された画像ファイル(.gif)を、NSImageViewの子ビューとして表示させたいです。
なお、NSImageViewについて、StoryboardからAnimates
およびEditable
プロパティにはチェックを入れております。
また、プロジェクトフォルダ内に同じ画像ファイルを配置し、StoryboardからImage Cellのimage
プロパティとして画像ファイルをファイル名で指定すると表示されることは確認できております。
発生している問題・エラーメッセージ
NSImageViewのimage
プロパティにURLを内部的に保持するNSImageオブジェクトをセットしましたが、表示されません。
また、URLの整合性や生成したNSImageのisValid
プロパティを確認してみたところ、NSImage#isValid == false
となっていたことから、NSImageインスタンスの生成の仕方が間違えているとは思うのですが、どう直せば有効なNSImageインスタンスが生成でき、最終的にNSImageViewに反映できるのかが分かりません。
該当のソースコード
swift
1/// アプリケーションウィンドウのコンテンツを管理するクラス 2class ViewController: NSViewController { 3 4 @IBOutlet weak var imageView: NSImageView! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 let isExists: Bool = FileManager.default.fileExists(atPath: "/Users/b150005/Downloads/sample1.gif") 10 print(isExists) // 確認用 11 print(NSImage(byReferencing: URL(fileURLWithPath: "/Users/b150005/Downloads/sample1.gif")).isValid) // 検証用 12 13 if (isExists) { 14 // NSImageViewに表示させる画像(NSImage)の指定 15 imageView.image = NSImage(byReferencing: URL(fileURLWithPath: "/Users/b150005/Downloads/sample1.gif")) 16 } 17 } 18}
実行結果
true false
試したこと
とりあえずNSImage#isValid
がtrue
となるように以下を試しました。
①NSImageのイニシャライザを変えてみる
・NSImage(contentsOfFile: "file:///Users/b150005/Downloads/sample1.gif")?.isValid
→ nil
・NSImage(contentsOf: URL(fileURLWithPath: "file:///Users/b150005/Downloads/sample1.gif"))?.isValid
→ nil
・NSImage(byReferencing: URL(string: "file:///Users/b150005/Downloads/sample1.gif")!).isValid
→ false
②URL文字列を変えてみる
・"file:///Users/b150005/Downloads/sample1.gif"
・"/Users/b150005/Downloads/sample1.gif"
→ 一部のイニシャライザを除き変化なし
→ URL(string:)
では下記の(ランタイム)エラーメッセージが表示されました。
nsurlconnection finished with error 1002
補足情報(FW/ツールのバージョンなど)
OS: macOS Big Sur
CPU: Intel Core i7(3.8GHz@8 core)
回答1件
あなたの回答
tips
プレビュー