【问题标题】:Swift - Populating Table View with DataSwift - 用数据填充表格视图
【发布时间】:2016-01-24 11:42:48
【问题描述】:

我正在尝试从 Parse 获取数据并填充表视图控制器。我在 VC 中定义了以下内容:

class OrdersViewController: UITableViewController{


    /*************************Global Objects************************/
    var userObject = UserClass()
    var utilities = Utilities()
    var orderObject = OrderClass()
    var objectsArray:[PFObject]!
    /*************************UI Components************************/

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        tableView.delegate = self
        tableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        SwiftSpinner.show("Please Wait...Populating Table")

        let query = PFQuery(className:"Orders")
        query.whereKey("appUsername", equalTo:PFUser.currentUser()!["appUsername"])
        query.findObjectsInBackgroundWithBlock {
            (objects: [PFObject]?, error: NSError?) -> Void in

            if error == nil {
                SwiftSpinner.hide()
                self.objectsArray = objects
            } else {
                SwiftSpinner.hide()

                // Log details of the failure
                print("Error: \(error!) \(error!.userInfo)")
            }
        }

        SwiftSpinner.hide()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objectsArray.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier = "cell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! OrderCell

        let row = indexPath.row
        cell.orderRetailerName.text = objectsArray[row]["nameRetailer"] as? String
        cell.status.text = objectsArray[row]["status"] as? String
        cell.dueDate.text = objectsArray[row]["dueDate"] as? String

        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        /*tableView.deselectRowAtIndexPath(indexPath, animated: true)

        let row = indexPath.row
        print("")*/
    }

}

在 viewWillAppear 中,我试图从 Parse 后端获取数据并用它填充表。当我运行程序时,我收到以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

错误是由 numberOfRowsInSection 中的 objectsArray.count 行引起的。足够公平......它正在尝试获取计数,但显然数组是空的,因为获取数据的工作正在后台运行并且尚未完成。这是我需要帮助的。我是否将获取代码放置在正确的位置(即 viewWillAppear)?如果没有,我应该把它放在哪里,以确保它在表实际尝试加载之前执行。

谢谢,

【问题讨论】:

    标签: ios xcode swift parse-platform


    【解决方案1】:

    您必须像其他人一样初始化 PFObject 数组。

    var objectsArray = [PFObject]()
    

    并且您必须在填充objectsArray 后立即在主线程上的表视图实例上调用reloadData()

    query.findObjectsInBackgroundWithBlock {(objects: [PFObject]?, error: NSError?) -> Void in
         if error == nil {
            self.objectsArray = objects!
            dispatch_async(dispatch_get_main_queue()) {
              self.tableView.reloadData()
            }
         } else {
            // Log details of the failure
            print("Error: \(error!) \(error!.userInfo)")
         }
         SwiftSpinner.hide()
    }
    

    【讨论】:

    • 您的意思是有一种方法可以将获取代码实际放置在初始化本身中?我对这门语言比较陌生
    • 在第 5 行中,您声明了数组,但没有对其进行初始化。查看语法差异。
    • 是的,我意识到这就是我修改之前评论的原因。有没有一个例子我可以看看它在哪里显示了初始化,然后我怎么能 reloadData()?
    • 是的,谢谢......现在对我来说更有意义......除了这段代码放在哪里?这部分是一开始的问题
    • 如果 objectsArray 完全按照我的回答中的建议进行初始化(作为非可选),numberOfRowsInSection 中就不会出错,因为该变量是非可选的并且具有已定义的状态。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多