gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:09:43 24 4
gpt4 key购买 nike

我基本上有一个显示几个不同类别的 ViewController(用 PFQueryTableViewController 解决了这个问题)。根据我点击的单元格,将执行到下一个 ViewController 的转场,所有属于点击的 Category 的对象都应该出现。

我做了什么:

我在解析中有 2 个类。显示 Category 中对象的类(Question)有一个指向 Category 类的指针列(填充了该指针列使用来自 Category 类对象的 objectID,对吗?)

在我的第一个 VC 中:在这里我用类别(作品)填充我的 TableView

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

在我的第二个 VC 中:我需要所有 detailObjects(问题)到我的类别

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

我在 AppDelegate 中的功能:

func getParseData(textOfSelectedCell: String) -> PFObject{

var query2 = PFQuery(className:"Category")
query2.whereKey("categoryName", equalTo: textOfSelectedCell)
query2.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects.count) scores.")
// Do something with the found objects
if let objects = objects as? [PFObject] {
for object in objects {
self.selectedObject = object
}
}
}
else {
// Log details of the failure
println("Error: \(error) \(error.userInfo!)")
}
}
println(selectedObject)
return selectedObject!

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

fatal error: unexpectedly found nil while unwrapping an Optional value

我该如何解决?

最佳答案

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

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

现在,您的查询应该针对此对象而不是字符串进行。名为 func getParseData(textOfSelectedCell: String) -> PFObject{ 的方法与应用委托(delegate)无关。 View Controller 应该直接进行查询,或者你应该有一个数据 Controller 类。在任何一种情况下,您实际上都不应该调用 Parse 来获取对象,因为 TableView Controller 已经拥有它。

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

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

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

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

关于ios - 如何在 TableViews 中使用 Parse 中的指针关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com