Swift 解析 - 本地数据存储和在表视图中显示对象
Swift Parse - local datastore and displaying objects in a tableview
我正在构建应用程序,通过解析将对象保存在本地数据存储区中。然后我 运行 一个查询来检索本地数据存储中的对象并且它工作正常。但是,我想获取对象及其中的内容,并根据存储在解析本地数据存储对象中的项目在 table 视图单元格中设置一些标签。例如,我创建了一个具有 "objectID"、"name"、"date"、"location" 等属性的对象。我想要做的是在主屏幕上有一个 table 视图,显示名称、日期、位置...等等。在每个单元格的标签中保存在本地数据存储中的每个项目。
我知道我保存正确:
// 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)")
}
并且当我 运行 查询时,我能够通过 运行ning 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")
可选(日期测试)
我想做的是获取解析对象本地数据存储中的名称字段,这是 table 视图控制器中单元格上标签的名称。
我不知道如何从对象访问该信息,以及如何正确设置标签。
有谁知道这是怎么可能的?
避免指针始终是个好主意哈哈...所以为什么不使用特定对象保存用户标识或用户名..
所以改变这一行:
parseLighthouse.setObject(PFUser.currentUser()!, forKey: "User")
到
parseLighthouse["username"] = PFUser.currentUser().username
回答
现在让我们在控制器 Class.
之外创建一个包含 objectID 和 Name 的结构
struct Data
{
var Name:String!
var id:String!
}
然后在Controller里面class,全局声明下面这行代码
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
VOila 应该是这样
我正在构建应用程序,通过解析将对象保存在本地数据存储区中。然后我 运行 一个查询来检索本地数据存储中的对象并且它工作正常。但是,我想获取对象及其中的内容,并根据存储在解析本地数据存储对象中的项目在 table 视图单元格中设置一些标签。例如,我创建了一个具有 "objectID"、"name"、"date"、"location" 等属性的对象。我想要做的是在主屏幕上有一个 table 视图,显示名称、日期、位置...等等。在每个单元格的标签中保存在本地数据存储中的每个项目。
我知道我保存正确:
// 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)")
}
并且当我 运行 查询时,我能够通过 运行ning 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") 可选(日期测试)
我想做的是获取解析对象本地数据存储中的名称字段,这是 table 视图控制器中单元格上标签的名称。
我不知道如何从对象访问该信息,以及如何正确设置标签。
有谁知道这是怎么可能的?
避免指针始终是个好主意哈哈...所以为什么不使用特定对象保存用户标识或用户名.. 所以改变这一行:
parseLighthouse.setObject(PFUser.currentUser()!, forKey: "User")
到
parseLighthouse["username"] = PFUser.currentUser().username
回答
现在让我们在控制器 Class.
之外创建一个包含 objectID 和 Name 的结构struct Data
{
var Name:String!
var id:String!
}
然后在Controller里面class,全局声明下面这行代码
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
VOila 应该是这样