【swift】swiftでは実機でデバイスに保存した画像が表示されない - Documentsディレクトリ内の画像を読み込む方法【CoffeeNote開発日記】
画像が表示できない
アプリのなかで,カメラロールやカメラで撮った画像をデバイス内に保存してるのに画像をアプリ内で表示させることができない.
simulatorでは動いてるんだけど...うーむ
---追記(10/27/2014)---
先日、(@takabosoft)https://twitter.com/takabosoftさんからこんなメンションをいただいた。
@totu_iy 外から失礼します。Swiftのブログを読ませて頂いたのですが、(当時連絡方法が不明のため)Qiitaの方へ検証記事を投稿させていただきました。http://t.co/sfaqAa5Vz9 こちらでは問題なく動作しておりますが、再現コードは残っていますでしょうか?
— たかぼー(Takabo Soft) (@takabosoft) 2014, 10月 27
実機で動かなかった原因は僕がcontentsOfFileじゃなくてnamedで画像を指定しようとしていたためでした。なるほど。。。
ということで、この方法ならちゃんと動きます。
swiftさん、攻めてしまってごめんなさい。。。
---------追記ここまで---------
Objective-Cでメソッドを実装してswiftで呼ぶ
結局最終的な解決策はこれでした.もう永遠になおらないかとおもったわ...やっぱりswiftの発展途上さが原因だった.
英語も日本語も片っ端から調べまくったけど,結局swiftでDocumentsディレクトリから保存した画像をとってきて表示する,というものがなかったので,あえなく最終的にこの方法を試すことになった.
まず以下のサイトを参考にObj-Cで実装したメソッドをswiftから呼べるように設定.
http://wonderpla.net/blog/engineer/SwiftWithObjective-C/
なんか変な名前やけど,Objective-Cで,NSObjectを親クラスとしたfor-image-filesっていう.hファイルと.mファイルを作成.
1年前にObjective-Cちょっと勉強してたけどもうすっかり忘れてたので,以下の記事を参考に.
http://www.objectivec-iphone.com/introduction/method/method.html
以下のように定義.
// for-image-files.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface for_image_files : NSObject - (UIImage *)loadImage:(NSString *)filePath; @end
// for-image-files.m #import "for-image-files.h" @implementation for_image_files - (UIImage *)loadImage:(NSString *)filePath { // ファイルから画像データを読み込み、UIImageオブジェクトを作成 UIImage *image= [[UIImage alloc] initWithContentsOfFile:filePath]; return image; } @end
AppName-Bridging-Header.hでfor-image-files.hをimportすれば,swiftからこのメソッドを呼び出せるようになる.
// AppName-Bridging-Header.h #import "for-image-files.h"
あとは実行.swiftファイルで定義したpathの情報が入ってる変数を渡してあげれば,それをUIImageオブジェクトとして返してくれる.それをお目当てのUIImageViewのimageプロパティに突っ込む
// ViewController.swift // デバイスのDocumentsディレクトリのパスを取得 let filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String // その中のimageの名前から最終的なパスを生成 var imageFilePath = filePath+"/img1.jpg" // for-image-filesクラスのobjオブジェクトを生成 var obj = for_image_files() // loadImageメソッドにさっきのパスを渡してやって,それをぶちこむ imageView.image = obj.loadImage(imageFilePath)
やっとこさ...
ということで,これでやっと実機でもちゃんとデバイスに保存された画像を読み込むことができた...まじで原因が分からなすぎてしにそうだった...笑
やっぱりまだまだswiftは発展途上だ.Obj-Cで定義されてて,swiftで定義されてないメソッドはたくさんあって,またブリッジを使う機会はあるだろうから,これを機会に覚えておこう.
でもswift愛してる!!!一生ついていきます!!!!!!!