如何在TableViews中使用Parse中的指针关系?

时间:2015-03-08 10:49:12

标签: ios uitableview swift parse-platform

我基本上有一个ViewController,它显示了几个不同的类别(用PFQueryTableViewController解决了)。根据哪个Cell我点击一个segue到下一个ViewController,其中应该出现属于被点击的Category的所有对象。

我做了什么:

我有两个解析类。显示CategoryQuestion s)中对象的类具有指向Category类的指针列(使用{{1}中的objectID填充指针列类对象,这是正确的吗?)

在我的firstVC中:在这里,我用表格(作品)填充我的TableView

Category

在我的第二个VC中:我需要所有detailObjects(class ChooseCategoriesVC: PFQueryTableViewController { var textOfSelectedCell:String = "" // Initialise the PFQueryTable tableview override init!(style: UITableViewStyle, className: String!) { super.init(style: style, className: className) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // Configure the PFQueryTableView self.parseClassName = "Category" self.textKey = "categoryName" self.pullToRefreshEnabled = true self.paginationEnabled = false } // Define the query that will provide the data for the table view override func queryForTable() -> PFQuery! { var query = PFQuery(className: "Category") query.orderByAscending("categoryName") query.whereKey("active", equalTo: true) return query } //override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject) -> PFTableViewCell { var Cell = tableView.dequeueReusableCellWithIdentifier("Cell") as CustomChooseCategoriesCell! if Cell == nil { Cell = CustomChooseCategoriesCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell") } // Extract values from the PFObject to display in the table cell Cell.chooseCategoryLabel.text = object["categoryName"] as String! var thumbnail = object["categoryIcon"] as PFFile var initialThumbnail = UIImage(named: "categoryIcon") Cell.customChooseCategoryIcon.image = initialThumbnail Cell.customChooseCategoryIcon.file = thumbnail Cell.customChooseCategoryIcon.loadInBackground() return Cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //get text of selected Cell let indexPath = tableView.indexPathForSelectedRow()! let selectedCell = tableView.cellForRowAtIndexPath(indexPath) as CustomChooseCategoriesCell! textOfSelectedCell = selectedCell.chooseCategoryLabel.text! self.performSegueWithIdentifier("vcToChooseQuestion", sender: self) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { //Pass ObjectId of selected Category from ChooseCategoryVC to ChooseQuestionVC var detailVC : ChooseQuestionVC = segue.destinationViewController as ChooseQuestionVC detailVC.selectedCategoryText = textOfSelectedCell } } s)到我的类别

Question

我在AppDelegate中的功能:

class ChooseQuestionVC: PFQueryTableViewController{

var selectedCategoryText : String!
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate

// Initialise the PFQueryTable tableview
override init!(style: UITableViewStyle, className: String!) {
    super.init(style: style, className: className)
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // Configure the PFQueryTableView
    self.parseClassName = "Question"
    self.textKey = "question"
    self.pullToRefreshEnabled = true
    self.paginationEnabled = false
}

// Define the query that will provide the data for the table view
override func queryForTable() -> PFQuery! {
    var query = PFQuery(className: "Question")
    query.whereKey("column", equalTo: self.appDelegate.getParseData(selectedCategoryText))
    query.orderByAscending("question")
    return query
}

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject) -> PFTableViewCell {

    var Cell = tableView.dequeueReusableCellWithIdentifier("Cell") as CustomChooseQuestionCell!
    if Cell == nil {
        Cell = CustomChooseQuestionCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
    }

    // Extract values from the PFObject to display in the table cell
    Cell.chooseQuestionLabel.text = object["question"] as String!

    return Cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("nextVC", sender: self)
    }
}

运行这样的代码时,我总是收到错误

  

致命错误:在解包可选值时意外发现nil

我该如何解决?

1 个答案:

答案 0 :(得分:1)

好的,听起来你的数据模型应该没问题,只是你尝试使用它的方式并不完全正确。

首先,我们希望在我们希望在视图控制器之间传递数据并进行查询时使用解析对象实例,而不是文本。对象包含最多信息,指针指向对象而不是字符串。因此,您希望将textOfSelectedCell更改为selectedCategory并将其指向PFObject。您应该从表视图控制器获取所选对象(因为它为您管理数据源),而不是从单元格。获得该对象后,将其传递给第二个视图控制器(而不是字符串)。

现在,您的查询应针对此对象而不是字符串。名为func getParseData(textOfSelectedCell: String) -> PFObject{的方法在应用委托上没有业务。视图控制器应该直接执行查询,或者您应该有一个数据控制器类。在任何一种情况下,您都不应该实际调用Parse来获取对象,因为表视图控制器已经拥有它。

您的展开问题与您的getParseData功能有关,因为它总是会返回nil。查询在后台运行,因此当函数返回时它将永远不会完成...删除getParseData函数。

因此,您的问题查询变为:

query.whereKey("column", equalTo: self.selectedCategory)

您只需查看objectAtIndexPath:上的PFQueryTableViewController功能即可填补空白。