2016-07-16 8 views
0

Ich bin neu beim Programmieren und habe Probleme beim Abrufen von Bildern aus Parse und beim Einfügen in die Bildansicht. Ich habe versucht, 'getDataInBackgroundWithBlock' aufzurufen, aber die automatische Vervollständigung zeigt es nicht an.Kann keinen Wert vom Typ UIImage zuweisen? PFFile eingeben?

class ListOfCategoriesViewController: UIViewController { 

@IBOutlet weak var tableView: UITableView! 

var categories: [DisplayCategory] = [] 


override func viewDidLoad() { 

    super.viewDidLoad() 

    // let queryCategories = DisplayCategory.query() 

    let titleQuery = PFQuery(className: "Category") 
    titleQuery.whereKeyExists("title") 
    let imageQuery = PFQuery(className: "Category") 
    imageQuery.whereKeyExists("imageCategory") 

    let query = PFQuery.orQueryWithSubqueries ([titleQuery, imageQuery]) 

    query.findObjectsInBackgroundWithBlock {(result: [PFObject]?, error: NSError?) -> Void in 

     self.categories = result as? [DisplayCategory] ?? [] 

     for category in self.categories { 
      do { 
       let data = try category.imageCategory?.getData() 

       category.imageCategory = UIImage(data: data!, scale:1.0) // compiler error here 
      } catch { 
       print("could not get image") 
      } 
     } 
    self.tableView.reloadData() 
    } 
    } 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

}

extension ListOfCategoriesViewController: UITableViewDataSource { 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return categories.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 


    let cell = tableView.dequeueReusableCellWithIdentifier("CategoryCell") as! CategoryTableViewCell 

    cell.categoryImageView.image = categories[indexPath.row].imageCategory //compiler error here 

    return cell 
    } 
} 

DisplayCategory Klasse sieht wie folgt aus. Die Idee ist, eine Tabellenansichtszelle mit Text und Bild von Parse anzuzeigen, also dachte ich, es wäre die beste Option, um eine neue Klasse für die Flexibilität anstatt für das Wörterbuch zu erstellen.

import Foundation 
import Parse 

class DisplayCategory: PFObject, PFSubclassing { 


@NSManaged var imageCategory: PFFile? 
@NSManaged var title: String? 

static func parseClassName() -> String { 
    return "Category" 
} 


override init() { 
    super.init() 
} 

override class func initialize() { 
    var onceToken : dispatch_once_t = 0; 
    dispatch_once(&onceToken) { 

     self.registerSubclass() 
    } 
} 

}

Antwort

0

Ausgabe abrufen behoben . Der Code wurde klarer, und es wurde festgestellt, dass Titel und Bild nicht getrennt abgerufen werden müssen. Hinzugefügt var imageCategory: UIImage? zur DisplayCategory-Klasse.

import Foundation 
import UIKit 
import Parse 


class ListOfCategoriesViewController: UIViewController { 

@IBOutlet weak var tableView: UITableView! 

var categories: [DisplayCategory] = [] 


override func viewDidLoad() { 

    super.viewDidLoad() 

    let query = PFQuery(className: "Category") 

    query.findObjectsInBackgroundWithBlock { (result: [PFObject]?, error: NSError?) -> Void in 

     self.categories = result as? [DisplayCategory] ?? [] 
     print("received \(self.categories.count) categories from parse DB, now fetch individual images") 

     for category in self.categories { 
      print("fetch image for category: \(category.title)") 

      category.imageCategoryFile?.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in 
       let image = UIImage(data: imageData!, scale: 1.0) 
       category.imageCategory = image 

       print("received image for category: \(category.title)") 
       self.tableView.reloadData() 
      } 
     } 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

}

extension ListOfCategoriesViewController: UITableViewDataSource { 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return categories.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    print("create cell for row: \(indexPath.row)") 

    let cell = tableView.dequeueReusableCellWithIdentifier("CategoryCell") as! CategoryTableViewCell 

    cell.categoryImageView.image = categories[indexPath.row].imageCategory 

    return cell 
} 

}

DisplayCategory Klasse sieht nun wie folgt

import Foundation 
import Parse 

class DisplayCategory: PFObject, PFSubclassing { 


@NSManaged var imageCategoryFile: PFFile? 
@NSManaged var title: String? 
var imageCategory: UIImage? 

static func parseClassName() -> String { 
    return "Category" 
} 


override init() { 
    super.init() 
} 

override class func initialize() { 
    var onceToken : dispatch_once_t = 0; 
    dispatch_once(&onceToken) { 
     // inform Parse about this subclass 
     self.registerSubclass() 
    } 
} 

}

0

Was ist die DisplayCategory Klasse/Objekt suchen, wie? würde das wahrscheinlich sehen müssen. auch in der Zwischenzeit können Sie versuchen, Ihre Anfrage für das Bild getrennt zu machen, wie so

let imageQuery = PFQuery(className:"Category") 
let image = imageQuery.objectForKey("imageFile")! as? PFFile { 
     image.getDataInBackgroundWithBlock({ 
      (imageData, error) -> Void in 
      if (error == nil) { 

//your for loop for setting the UIImage in DisplayCategory class/object here 

      category.imageCategory = UIImage(data:imageData!)! 

      } 
     }) 
    } 

Ihre „Kategorie“ Klasse auf Parse abzufragen und das Element in der „imagefile“ -Spalte

+0

Added DisplayCategory. Würde mich wirklich freuen, wenn Sie es sich ansehen können. Vielen Dank! –

Verwandte Themen