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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

3回答

3888閲覧

dataWithContentsOfFileでnilが返ってくる

interpiamobile

総合スコア66

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

1クリップ

投稿2016/02/16 02:04

現在dataWithContentsOfFileに画像のパスを指定して画像を取得しようとしているのですが、nilが返ってきてしまいます。コードは以下のように書いています。

objective

1NSString *imagePath = [products getImagePath:productsID]; 2NSData *imgData = [NSData dataWithContentsOfFile:imagePath];

imagePath変数には /var/mobile/ から .png までのパスが入っています。
ちなみに[[NSData alloc] initContentsOfFile]を使ってもnilが返ってきました。
どうすればパスから画像を取得することができるでしょうか?
どなたかわかる方がいれば教えていただきたいです。宜しくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

Documentsフォルダにアクセスするなら、これでどうでしょうか。

objectivec

1NSString *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 2NSLog(@"docs=%@", docs); 3NSString *imagePath = [docs stringByAppendingPathComponent:@"image1.png"]; 4NSLog(@"imagePath=%@", imagePath); 5NSData *imgData = [NSData dataWithContentsOfFile:imagePath]; 6NSLog(@"imgData.length=%zd", imgData.length);

ログはこんな感じ。

docs=/var/mobile/Applications/(省略)/Documents
imagePath=/var/mobile/Applications/(省略)/Documents/image1.png
imgData.length=5772

投稿2016/02/16 07:42

fuzzball

総合スコア16731

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

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

interpiamobile

2016/02/16 07:51

ご回答ありがとうございます。ご提示の方法を試してみると、画像を取ってくることができました!誠にありがとうございました。
fuzzball

2016/02/16 08:00

解決にしちゃってますが、[products getImagePath:productsID] は直せたのでしょうか?
interpiamobile

2016/02/17 01:01

はい、getImagePathで「var/〜image1.png」までパスが取れており、最後の「image1.png」だけ欲しかったので、以下のようにしてご提示の解決方法と合わせることで問題が解決できました。 NSString *imagePath = [products getImagePath:productsID]; NSArray *imagePathSplitArray = [imagePath componentsSeparatedByString:@"/"]; NSString *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *imageName = [docs stringByAppendingPathComponent:[imagePathSplitArray lastObject]]; NSData *imgData = [NSData dataWithContentsOfFile:imageName];
fuzzball

2016/02/17 01:14 編集

getImagePath:productsIDの中身は触れないということなんですかね。 ちなみに、NSStringのlastPathComponent(ファイル名取得)を使えば、 NSString *imagePath = [products getImagePath:productsID]; NSString *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *imageName = [docs stringByAppendingPathComponent:[imagePath lastPathComponent]]; でOKです。
interpiamobile

2016/02/18 01:55

lastPathComponentなんてあるのですね!これを使ってもきちんと画像が表示されましたし、こっちの方がシンプルでいいですね!ありがとうございます。
guest

0

そのパスに画像がちゃんと入っているかどうかはどうやって確認したんですか?

そのパスがDocumentsフォルダなのであれば、アプリ自身の処理で何かファイルを格納しない限り、最初からそこには何も入っていません。
アプリ自身の処理でファイルを格納する処理があるなら、その格納パスと一致しているかよく確認して見ることをお勧めします。

もしアプリ自身の処理でDocumentsフォルダに画像ファイルを格納したのではなく、Xcodeのプロジェクトに画像を追加して、アプリにバンドルされている画像を読み込もうとしているのであれば、読み込み先はそこではなく
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
で得られるパスになります。
(参考)
http://iphone-tora.sakura.ne.jp/nsbundle.html

投稿2016/02/16 05:29

TakeOne

総合スコア6299

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

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

interpiamobile

2016/02/16 05:56

ご回答ありがとうございます。Xcodeのwindow → Devices → 対象のアプリを選択して歯車アイコンを押して「Download Container...」 → ダウンロードしたファイルを右クリックで「パッケージの内容を表示」 → AppData → Documentsというふうに進み、このDocuments内に画像があることは確認しています。...ひょっとして別のパスを参照していますか?
TakeOne

2016/02/16 07:51

Documentsフォルダにどんなファイルが格納されているのかの確認方法はそれで正しいです。 念のため確認したいのですが、dataWithContentsOfFileを実行している自分のアプリと別のアプリのDocumentsフォルダにはアクセスできません。今回やろうとしているのは、自分のアプリのDocumentsフォルダにアクセスしようとしているということでよいですか? そうであれば、 NSLog(@"%@",NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]); を実行して出力されるパスを確認し、それとimagePathに格納されているパス(特にUUID部分である"3C01A1B8-A90B-442F-A95F-C78DF015794F")が一致しているか確認してみてください。 異なっているなら、[products getImagePath:productsID]がなぜ誤ったパスを返すのかを調べる必要があります。 というか、自アプリのDocumentsフォルダパスを取得したいだけなら、前述の通りNSSearchPathForDirectoriesInDomainsを使って取得すればいいと思います。
interpiamobile

2016/02/17 01:05

NSSearchPathForDirectoriesInDomainsを使うことで解決することができました。 自アプリのDocumentsフォルダパスを取得するだけならこのメソッドを使えば良いのですね。誠にありがとうございました。
guest

0

imagePathには存在しているファイルまでのフルパスが代入されているか確認してみてください。

//NSString *imagePath = [products getImagePath:productsID]; NSString *imagePath = @"/full/path/to/image.png"; NSData *imgData = [NSData dataWithContentsOfFile:imagePath];

上記のようにハードコーディングして検証する方法もあります。(サンドボックス内を前提としてます)

投稿2016/02/16 04:09

NCC1701

総合スコア1680

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

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

interpiamobile

2016/02/16 04:43

ご回答ありがとうございます。 imagePathには「/var/mobile/Containers/Data/Application/3C01A1B8-A90B-442F-A95F-C78DF015794F/Documents/image1.png」 といったような文字列が入っています。これはフルパスですよね? なるほど、パスをハードコーディングして検証するやり方もあるのですね。参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問