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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

2209閲覧

コアデータに保存したスクショ画像を別の画面で表示することができなくて困っています。

hatta-

総合スコア8

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/11/30 06:13

編集2022/01/12 10:55

[プログラミング初心者、swift歴3ヶ月]
・前提・実現したいこと

画面をスクリーンショットし、それをコアデータに保存。画面推移をした画面でコアデータに保存したスクショ画像を表示させる機能を実装したいです。

・発生している問題

スクショ画像の表示ができなくて困っています。調べても保存した文字列を表示させる方法が出るだけで、画像を表示させる方法がわからりません。保存まではできています。
以前回答して頂いた通りにやってみてもエラーがでて、そこから自分なりに改善してみた結果も'[(Picture)]' does not have a member named 'picture'というエラーがでています。
コアデータに保存した画像を表示させる方法を教えていただきたいです。
よろしくお願いいたします。

・ソースコード

ShowViewController.swift (スクショされた画像を表示する。問題がおきている方です。)

swift

1import UIKit 2import CoreData 3 4class ShowViewController: UIViewController { 5 6 7 var myPicture = [Picture]() 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 readData() 13 14 } 15 16 override func didReceiveMemoryWarning() { 17 super.didReceiveMemoryWarning() 18 } 19 20 func readData(){ 21 22 let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 23 let myContext: NSManagedObjectContext = appDel.managedObjectContext! 24 25 let myRequest: NSFetchRequest = NSFetchRequest(entityName: "Picture") 26 myRequest.returnsObjectsAsFaults = false 27 28 //var results: NSArray! = myContext.executeFetchRequest(myRequest, error: nil) 29 30 myPicture = myContext.executeFetchRequest(myRequest, error: nil)as! [Picture] 31 32 // UIImage インスタンスの生成 33 let image1:UIImage? = UIImage(data: myPicture.picture) **エラー部分'[(Picture)]' does not have a member named 'picture' 34 35 // UIImageView 初期化 36 let imageView = UIImageView(image:image1) 37 38 // 画像の中心を187.5, 333.5 の位置に設定、iPhone6 39 imageView.center = CGPointMake(187.5, 333.5) 40 41 // UIImageViewのインスタンスをビューに追加 42 self.view.addSubview(imageView) 43 44 } 45} 46

Viewcontroller.swift (写真が表示されていて、それをスクショする。)

swift

1import UIKit 2import CoreData 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var screenShotImageView: UIImageView! 7 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 } 13 14 override func didReceiveMemoryWarning() { 15 super.didReceiveMemoryWarning() 16 // Dispose of any resources that can be recreated. 17 } 18 19 func screenShot() { 20 // スクリーンショットの取得開始 21 UIGraphicsBeginImageContextWithOptions(view.bounds.size, true, 1.0) 22 23 // 描画 24 view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) 25 26 // 描画が行われたスクリーンショットの取得 27 let screenShot = UIGraphicsGetImageFromCurrentImageContext() 28 29 // スクリーンショットの取得終了 30 UIGraphicsEndImageContext() 31 32 // 取得したスクリーンショットを表示 33 //screenShotImageView.image = screenShot 34 35 //取得したスクリーンショットをコアデータに入れる 36 var imageData = UIImagePNGRepresentation(screenShot) 37 38 let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 39 let myContext: NSManagedObjectContext = appDel.managedObjectContext! 40 41 let myEntity: NSEntityDescription! = NSEntityDescription.entityForName("Picture", inManagedObjectContext: myContext) 42 43 var newData = Picture(entity: myEntity, insertIntoManagedObjectContext: myContext) 44 newData.picture = imageData 45 46 } 47 48 49 @IBAction func screenShot(sender: AnyObject) { 50 screenShot() 51 } 52}

Picture.swift (コアデータ)

swift

1import UIKit 2import Foundation 3import CoreData 4 5class Picture: NSManagedObject { 6 7 @NSManaged var picture: NSData 8 9} 10

コアデータの内容
ENTITIES : Picture
Attributes : picture Type:Binary Data

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

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

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

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

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

guest

回答1

0

iOS7にも対応させたい場合AssetsLibraryを使用します。

import AssetsLibrary

//第一引数のurlに、CoreDataに保存した画像のURLを渡します
ALAssetsLibrary().assetForURL(url,
resultBlock: { (asset: ALAsset!) in
// Convert from ALAsset to NSData
let representation = asset.defaultRepresentation()
let bufferSize = Int(representation.size())
let buffer = UnsafeMutablePointer<UInt8>(malloc(bufferSize))
let buffered = representation.getBytes(buffer, fromOffset: 0, length: Int(representation.size()), error: nil)
data = NSData(bytesNoCopy: buffer, length: buffered, freeWhenDone: true)
//このdataに画像データが渡されるので、UIImageViewのimageプロパティにdataを指定すれば
//画像が表示されます。
},
failureBlock: { (error: NSError!) in
failure(error)
}
)

投稿2015/12/01 16:00

Unixer

総合スコア143

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

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

hatta-

2015/12/10 07:07

回答ありがとうございます。返信がおくれてしまい申し訳ありません。色々試してみたのですがまだできてないです。つきましては質問が2点あります。 ①スクリーンショットなので画像のURLが存在しない場合はどうすればいいでしょうか? ②failureに対して次のようなエラーが出ます。 Implicit use of 'self' in closure; use 'self.' to make capture semantics explicit どう対処すればよいでしょうか? ちなみに変数の宣言は以下のようにしています var failure:NSError? var error:NSError? ご教授よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問