読者です 読者をやめる 読者になる 読者になる

【swift】swiftでは実機でデバイスに保存した画像が表示されない - Documentsディレクトリ内の画像を読み込む方法【CoffeeNote開発日記】

画像が表示できない

アプリのなかで,カメラロールやカメラで撮った画像をデバイス内に保存してるのに画像をアプリ内で表示させることができない.

simulatorでは動いてるんだけど...うーむ


---追記(10/27/2014)---

先日、(@takabosoft)https://twitter.com/takabosoftさんからこんなメンションをいただいた。

実機で動かなかった原因は僕が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愛してる!!!一生ついていきます!!!!!!!