2017-07-31 3 views
0

イメージをtableViewセルに戻す際に問題が発生しています。UIImageは、jsonのリクエストからmysqlデータベースへのnilをtableViewセルイメージ用に返しますか?

私は、文字列のすべてに、すべてのrecipientImgパラメータを変更細かい動作しますが、私はUIImageにrecipientImgパラメータを変更したときに、私は(データは 致命的なエラーダウンロード:オプションの値をアンラップしながら、予想外にnilを)取得 (lldb)

Psデータベースのファイルパスをイメージとして返そうとしています。他の2つの文字列は、文字列としてtableViewに戻りますが、イメージを返すようにimageViewを取得できません。

ヒントまた、私はデータベースここ

で[VARCHAR]としてRecipientImgを使用してい

This is the JSON file on the server from the database はここviewermodel1.swift

import UIKit 

class viewedMeModel1: NSObject { 
//properties 

var username: String? 
var messageDetail: String? 
var recipientImg: UIImage? 
//empty constructor 

override init() 
{ 

} 

//construct with parameters 

init(username: String, messageDetail: String, recipientImg: UIImage)  { 

    self.username = username 
    self.messageDetail = messageDetail 
    self.recipientImg = recipientImg 
} 


//prints object's current state 


} 

あり、ここでviewedMeModel2.swift

import UIKit 

protocol viewedMeModel2Protocol: class { 
func itemsDownloaded(items: NSArray) 
} 


class viewedMeModel2: NSObject { 
weak var delegate: viewedMeModel2Protocol! 

var data = Data() 

let urlPath: String = "http://" //this will be changed to the path where .php lives 

func downloadItems() { 

    let url: URL = URL(string: urlPath)! 
    let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default) 

    let task = defaultSession.dataTask(with: url) { (data, response, error) in 

     if error != nil { 
      print("Failed to download data") 
     }else { 
      print("Data downloaded") 
      self.parseJSON(data!) 
     } 

    } 

    task.resume() 
} 

func parseJSON(_ data:Data) { 

    var jsonResult = NSArray() 

    do{ 
     jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray 

    } catch let error as NSError { 
     print(error) 

    } 

    var jsonElement = NSDictionary() 
    let locations = NSMutableArray() 

    for i in 0 ..< jsonResult.count 
    { 

     jsonElement = jsonResult[i] as! NSDictionary 

     let location = viewedMeModel1() 

     //the following insures none of the JsonElement values are nil through optional binding 
     if let username = jsonElement["Username"] as? String, 
      let messageDetail = jsonElement["MessageDetail"] as? String, 
      let recipientImg = jsonElement["RecipientImg"] as? UIImage 

     { 

      location.username = username 
      location.messageDetail = messageDetail 
      location.recipientImg = recipientImg 

     } 

     locations.add(location) 

    } 

    DispatchQueue.main.async(execute: {() -> Void in 

     self.delegate.itemsDownloaded(items: locations) 

    }) 
} 

} 

ですviewedMeController.swiftです インポートUIKit

class ViewerViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, viewedMeModel2Protocol { 


var feedItems: NSArray = NSArray() 
var selectedLocation : viewedMeModel1 = viewedMeModel1() 





@IBOutlet weak var viewedMe: UITableView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
self.viewedMe.delegate = self 
    self.viewedMe.dataSource = self 

    let ViewedMeModel2 = viewedMeModel2() 
    ViewedMeModel2.delegate = self 
    ViewedMeModel2.downloadItems() 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func itemsDownloaded(items: NSArray) { 

    feedItems = items 
    self.viewedMe.reloadData() 

} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return feedItems.count 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // Return the number of feed items 
    return feedItems.count 

} 



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    // Retrieve cell 
    let cellIdentifier: String = "basicCell" 
    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)! 
    // Get the location to be shown 
    let item: viewedMeModel1 = feedItems[indexPath.row] as! viewedMeModel1 

    // Get references to labels of cell 
    cell.UIImage?.image = item.recipientImg! 
    return cell 
} 
+0

そして、もう一つの発言メイト、あなたの命名規則は、常にクラスとプロトコルのための大文字の名前を使用する必要があり、本当に悪いです、そして、変数名にキャメルケース。 –

答えて

1

問題は、この行では、あなたのviewedMeModel2.swiftである:

let recipientImg = jsonElement["RecipientImg"] as? UIImage 

jsonElement [ "RecipientImg"]は、Aであるため、条件付きの開封された結果はなかれ、recipientImg = nilのを返します。 UIImageにキャストすることはできません。 あなたがこれにあなたのコードを書き換える必要があります。

if let username = jsonElement["Username"] as? String, 
     let messageDetail = jsonElement["MessageDetail"] as? String, 
     let recipientImgString = jsonElement["RecipientImg"] as? String 

    { 

     location.username = username 
     location.messageDetail = messageDetail 
     location.recipientImg = UIImage(named: recipientImgString) 
    } 
+0

これはかなり正しいですが、UIImage(名前付き:String)イニシャライザは、アプリケーションのメインバンドルに保存する画像にのみ使用されていることは間違いありません。 (画像資産フォルダにローカルに保存した画像) – user3353890

+0

あなたはそうです、私はPOが彼の例のJSONの内容のために画像資産に画像を保存していると仮定します。はい私のUIImage(名前:)間違っている可能性があります:) –

+0

すべての心配はありません!彼がローカルに保管していることは間違いありません。彼がそうでない場合に備えて、それを指摘したかっただけです。 :) – user3353890

1

私の推測では、jsonElement["RecipientImg"]StringないUIImageを返しているので、あなたがイメージとして文字列をキャストすることはできませんので、あなたがnilを取得しているということです。 jsonElement["RecipientImg"]からイメージURLを取得しようとしていて、そのURLからUIImageを作成してください。あなたは、データオブジェクトのいくつかの並べ替えを取得している場合にもUIImage初期化子init?(data: Data)を使用することができます

let imageURL = jsonElement["RecipientImg"] as? String 
let myImage = UIImage(contentsOfFile: imageURL) 

:このような何か。

また、jsonElement["RecipientImg"]のオブジェクトは、おそらくUIImageにキャストできません。私の推測は、Stringです。それが何で、どのようなものであるかを調べてから、適切なUIImageイニシャライザを使用してください。

https://developer.apple.com/documentation/uikit/uiimage

関連する問題