Ios SWIFT中的ParseUI PFQueryTableViewController

Ios SWIFT中的ParseUI PFQueryTableViewController,ios,uitableview,parse-platform,pfquerytableviewcontrolle,Ios,Uitableview,Parse Platform,Pfquerytableviewcontrolle,我试图连续使用两个PFQueryTableViewControllers,以便在第一个控制器中选择的行生成第二个带有详细查询的tableview。我想这是一件很平常的事 第二个视图控制器抛出以下消息: ***由于未捕获的异常“NSInternalInconsistencyException”,正在终止应用程序,原因:”-[UITableViewController loadView]加载了“EQR-J7-VNh-view-gYk-IB-w7b”nib,但未获得UITableView 我在第一个表

我试图连续使用两个PFQueryTableViewControllers,以便在第一个控制器中选择的行生成第二个带有详细查询的tableview。我想这是一件很平常的事

第二个视图控制器抛出以下消息:

***由于未捕获的异常“NSInternalInconsistencyException”,正在终止应用程序,原因:”-[UITableViewController loadView]加载了“EQR-J7-VNh-view-gYk-IB-w7b”nib,但未获得UITableView

我在第一个表中的单元格和新的视图控制器之间定义了一个“show”segue,但是当它发生时,上面的消息就会出现,而第二个控制器永远不会被调用。如果我将第二个控制器类更改为常规的UIViewController,则一切正常

我得到的印象是,我需要在.nib中将PFQueryTableViewController重铸为UIViewController,但我不知道如何做到这一点,也不知道为什么Parse会将其定义为其他东西。谁能给我点化一下吗。我从一个快速的角度出发,认为基于故事板的用户界面可以解决问题

代码如下:

目标(第二)视图控制器:

import Parse
import UIKit
import ParseUI


class ClubDetailsViewController: PFQueryTableViewController {

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 = "USACourses"
    self.textKey = "course_name"
    self.pullToRefreshEnabled = true
    self.paginationEnabled = false
    self.objectsPerPage = 10
}



@IBOutlet weak var detailClubName: UILabel!
@IBOutlet weak var detailAddress: UILabel!
@IBOutlet ...
import UIKit
import Parse
import ParseUI


class ClubTableViewController: PFQueryTableViewController {

    // 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 = "USAClubs"
        self.textKey = "club_name"
        self.pullToRefreshEnabled = true
        self.paginationEnabled = true
        self.objectsPerPage = 20
    }

    override func queryForTable() -> PFQuery {
        var query = PFQuery(className: "USAClubs")
        query.orderByAscending("club_name")
        return query
    }

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

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

        // Extract values from the PFObject to display in the table cell
        if let nameClub = object?["club_name"] as? String {
            cell?.textLabel?.text = nameClub
        }
        if let clubtype = object?["club_membership"] as? String {
            cell?.detailTextLabel?.text = clubtype
        }

        return cell
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var detailScene = segue.destinationViewController as! ClubDetailsViewController

        // Pass the selected object to the destination view controller.
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            let row = Int(indexPath.row)
            detailScene.currentClubObject = (objects?[row] as! PFObject)
        }
    }

    override func viewDidAppear(animated: Bool) {

        // Refresh the table to ensure any data changes are displayed
        tableView.reloadData()
    } // end view did appear
}
第一视图控制器:

import Parse
import UIKit
import ParseUI


class ClubDetailsViewController: PFQueryTableViewController {

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 = "USACourses"
    self.textKey = "course_name"
    self.pullToRefreshEnabled = true
    self.paginationEnabled = false
    self.objectsPerPage = 10
}



@IBOutlet weak var detailClubName: UILabel!
@IBOutlet weak var detailAddress: UILabel!
@IBOutlet ...
import UIKit
import Parse
import ParseUI


class ClubTableViewController: PFQueryTableViewController {

    // 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 = "USAClubs"
        self.textKey = "club_name"
        self.pullToRefreshEnabled = true
        self.paginationEnabled = true
        self.objectsPerPage = 20
    }

    override func queryForTable() -> PFQuery {
        var query = PFQuery(className: "USAClubs")
        query.orderByAscending("club_name")
        return query
    }

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

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

        // Extract values from the PFObject to display in the table cell
        if let nameClub = object?["club_name"] as? String {
            cell?.textLabel?.text = nameClub
        }
        if let clubtype = object?["club_membership"] as? String {
            cell?.detailTextLabel?.text = clubtype
        }

        return cell
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var detailScene = segue.destinationViewController as! ClubDetailsViewController

        // Pass the selected object to the destination view controller.
        if let indexPath = self.tableView.indexPathForSelectedRow() {
            let row = Int(indexPath.row)
            detailScene.currentClubObject = (objects?[row] as! PFObject)
        }
    }

    override func viewDidAppear(animated: Bool) {

        // Refresh the table to ensure any data changes are displayed
        tableView.reloadData()
    } // end view did appear
}

确保要设置为ClubDetailsViewController的ViewController是UITableViewController而不是UIViewController


PFQueryTableViewController是UITableViewController的子类,而UITableViewController又是UIViewController的子类。要使ViewController符合UITableViewController,它需要遵循某些规则,例如拥有UITableView和没有其他子视图。将UITableViewController拖到情节提要上时,它会确保它遵循所需的规则。

在情节提要中,是否将第二个视图控制器的类设置为ClubDetailsViewController?是。正如我所说,当我将它从PFQueryTableViewController更改为UIViewController时,它工作正常。如果我找不到答案,我将不得不这样做作为解决办法。