画像が表示できない
アプリのなかで,カメラロールやカメラで撮った画像をデバイス内に保存してるのに画像をアプリ内で表示させることができない.
simulatorでは動いてるんだけど...うーむ
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
以下のように定義.
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface for_image_files : NSObject - (UIImage *)loadImage:(NSString *)filePath; @end
#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からこのメソッドを呼び出せるようになる.
#import "for-image-files.h"
あとは実行.swiftファイルで定義したpathの情報が入ってる変数を渡してあげれば,それをUIImageオブジェクトとして返してくれる.それをお目当てのUIImageViewのimageプロパティに突っ込む
// デバイスの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愛してる!!!一生ついていきます!!!!!!!