Swift Parse - 本地数据存储并在表格视图中显示对象

Posted

技术标签:

【中文标题】Swift Parse - 本地数据存储并在表格视图中显示对象【英文标题】:Swift Parse - local datastore and displaying objects in a tableview 【发布时间】:2015-12-02 10:34:46 【问题描述】:

我正在构建和应用程序,它通过解析将对象保存在本地数据存储中。然后我运行一个查询来检索本地数据存储中的对象,它工作正常。但是,我想抓取对象及其中的内容,并根据存储在解析本地数据存储对象中的项目在表格视图单元格中设置一些标签。例如,我制作了一个具有“objectID”、“name”、“date”、“location”等属性的对象。我想做的是在主屏幕上有一个表格视图,显示名称、日期、位置……等。在每个单元格的标签中保存在本地数据存储中的每个项目。

我知道我保存正确:

// parse location object

    let parseLighthouse = PFObject(className: "ParseLighthouse")
    parseLighthouse.setObject(PFUser.currentUser()!, forKey: "User")
            parseLighthouse["Name"] = self.placeTitle.text
            parseLighthouse["Note"] = self.placeNote.text
            parseLighthouse["Locality"] = self.placeDisplay.text!
            parseLighthouse["Latt"] = self.map.region.center.latitude
            parseLighthouse["Longi"] = self.map.region.center.longitude
            parseLighthouse["LattDelta"] = 0.5
            parseLighthouse["LongiDelta"] = 0.5
            parseLighthouse["Date"] = dateInFormat
            parseLighthouse.pinInBackground()
            parseLighthouse.saveInBackgroundWithBlock  (success: Bool, error: NSError?) -> Void in
                println("Object has been saved. ID = \(parseLighthouse.objectId)")
            

当我运行查询时,我可以通过运行 println(object.objectForKey("Name")) 来访问属性

func performQuery() 
    let query = PFQuery(className: "ParseLighthouse")

    query.fromLocalDatastore()
    query.whereKey("User", equalTo: PFUser.currentUser()!)
    query.findObjectsInBackgroundWithBlock  (objects, error) -> Void in
        if error == nil 
            // The find succeeded.
            println("Successfully retrieved \(objects!.count) lighthouses.")
            // Do something with the found objects
            if let light = objects as? [PFObject] 
                for object in light 
                    println(object.objectId)
                    println(object.objectForKey("Name"))



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

因为在运行查询时,我按预期取回了对象 ID 和名称。

成功取回 2 座灯塔。 可选(“A3OROVAMIj”) 可选(快乐) 可选(“bbyqPZDg8W”) 可选(日期测试)

我想做的是获取解析对象本地数据存储中的名称字段,它是表格视图控制器中单元格上的标签名称。

我不知道如何从对象访问该信息,并正确设置标签。

有人知道这怎么可能吗?

【问题讨论】:

你的tableView准备好了吗?所以你可以开始从 parse 访问数据并在那里显示它?或者你在问如何用 parse.com 数据做 tableView? 您是说您正在获取一个名为“object”的对象,但它实际上是您正在使用的自定义类对象?您是否尝试过将其转换为实际类并以这种方式访问​​该属性?在 Objective C 中,你会做这样的事情来访问 name 属性: ((PFUser*)object).name 虽然我不确定 swift 等价物是什么。 所以你的查询函数工作正常,你应该想要获取这些信息然后加载你的tableview中的所有单元格......对吗?? 是的,我目前有一个表格视图设置。我想我的主要问题是访问解析对象中的属性时遇到问题。当我制作一个时,它会与客户类“ParseLighthouse”一起保存,并且在该对象中有一个名称、纬度经度注释日期......等等。我希望能够从 ParseLighthouse 中获取这些名称注释等,并将其设置为我的旅行视图中的标签 等一下,我正在写答案 【参考方案1】:

避免使用指针 lol 总是一个好主意......所以为什么不使用特定对象保存用户 ID 或用户名...... 所以改变这一行:

 parseLighthouse.setObject(PFUser.currentUser()!, forKey: "User")

 parseLighthouse["username"] = PFUser.currentUser().username

回答

现在让我们在控制器类之外创建一个包含 objectID 和 Name 的结构。

struct Data

var Name:String!
var id:String!

然后在Controller类里面,全局声明下面这行代码

 var ArrayToPopulateCells = [Data]()

那么您的查询函数将如下所示:

 func performQuery() 
    let query = PFQuery(className: "ParseLighthouse")

    query.fromLocalDatastore()
    query.whereKey("User", equalTo: PFUser.currentUser()!)
    query.findObjectsInBackgroundWithBlock  (objects, error) -> Void in
        if error == nil 
            // The find succeeded.
            print("Successfully retrieved \(objects!.count) lighthouses.")
            // Do something with the found objects
            if let light = objects as? [PFObject] 
                for object in light 
                    print(object.objectId)
                    print(object.objectForKey("Name"))
                    var singleData = Data()
                    singleData.id = object.objectId
                    singleData.Name = object["Name"] as! String

                    self.ArrayToPopulateCells.append(singleData)


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

tableView中的numberOfRowinSection()

return ArrayToPopulateCells.count

在cellForRowAtIndexPath()中

       var data = ArrayToPopulateCells[indexPath.row]
       cell.textlabel.text = data.objectID
       cell.detailLabel.text = data.Name

瞧,应该是这样

【讨论】:

好的,我按照你的指示做了,他们似乎做得很好,没有错误。但表格视图中没有显示任何内容。我完全遵循了代码,那里什么都没有。我不完全确定这些项目是否被添加到 arrayToPopulateCells 数组中。有什么想法吗? 你是否重新加载了tableview 是的,它现在正在工作。谢谢。另一个问题,你知道我现在如何从本地数据存储和 parse.com 中滑动以删除单元格中的项目吗? 我认为该方法被称为 commiteditingstyle() 一旦启用它选择删除样式然后您可以滑动删除 关于如何在 commitededitingstyle 方法中定位解析对象的任何想法?我可以滑动和删除单元格,但想要定位解析对象并取消固定并删除它。解析文档有帮助,但我似乎无法正确处理

以上是关于Swift Parse - 本地数据存储并在表格视图中显示对象的主要内容,如果未能解决你的问题,请参考以下文章

Parse.com PFQueryTableViewController 本地数据存储

parse.com swift - 在 tableView 单元格中取消固定和删除对象

Parse.com 多用户访问数据 - Swift

Swift - 根据数组值从 Parse 表中加载

解析本地数据存储 + 网络同步

如何在 Swift 应用程序中保存本地数据?