【问题标题】:Cannot assign value of type UIImage? to type PFFile?无法分配 UIImage 类型的值?键入PFFile?
【发布时间】:2016-07-16 18:54:46
【问题描述】:

我是编程新手,在从 Parse 获取图像并将其放入 Image View 时遇到问题。我试图调用“getDataInBackgroundWithBlock”,但自动完成不显示它。

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 类看起来像这样。这个想法是显示一个表格视图单元格,其中包含来自 Parse 的文本和图像,所以我认为创建新类以实现灵活性而不是字典是最佳选择。

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()
    }
}

}

【问题讨论】:

    标签: ios swift parse-platform uiimage


    【解决方案1】:

    DisplayCategory 类/对象是什么样的?可能需要看到这一点。 同时您也可以尝试单独查询图片,就像这样

    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!)!
    
                }
            })
        }
    

    在解析时查询您的“类别”类并检索“imageFile”列中的项目

    【讨论】:

    • 添加了显示类别。如果您能看一看,将不胜感激。谢谢!
    【解决方案2】:

    问题已解决。使代码更清晰,发现不需要单独获取标题和图像。添加了 var imageCategory: UIImage?到 DisplayCategory 类。

    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 类现在看起来像这样

    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()
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2018-06-08
      相关资源
      最近更新 更多