添加新条目后如何重新加载表视图?
How to reload tableview after adding new entry?
我正在创建一个 cloudkit 表格视图。我加载了该应用程序,我的 tableview 出现了我从云工具包中输入的内容。
然后我使用我的添加方法 insertNewObject
将记录添加到云工具包,但这并没有显示在我的表视图中。它只会出现在我的下一个 运行 应用程序中。
func insertNewObject(sender: AnyObject) {
let record = CKRecord(recordType: "CloudNote")
record.setObject("New Note", forKey: "Notes")
MyClipManager.SaveMethod(Database!, myRecord:record)
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
这是我的添加方法。如您所见,我正在调用 tableview 重新加载,但没有任何反应。
我的表格视图创建代码:
// Tableview stuff --- Done
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
/////// Get number of rows
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
//// FIll the table
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let object = objects[indexPath.row]
cell.textLabel!.text = object.objectForKey("Notes") as? String
return cell
}
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
按要求:保存到CloudDB的方法
func SaveMethod(publicDatabase: CKDatabase, myRecord: CKRecord ) -> CKRecord {
publicDatabase.saveRecord(myRecord, completionHandler:
({returnRecord, error in
if let err = error {
self.notifyUser("Save Error", message:
err.localizedDescription)
} else {
dispatch_async(dispatch_get_main_queue()) {
self.notifyUser("Success",
message: "Record saved successfully")
}
}
}))
return myRecord
}
我在masterview中的viewdidload方法:
override func viewDidLoad() {
super.viewDidLoad()
// Database loading on runtime
Database = container.privateCloudDatabase
///Build Query
let query = CKQuery(recordType: "CloudNote", predicate: NSPredicate(format: "TRUEPREDICATE"))
///Perform query on DB
Database!.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in
if (error != nil) {
NSLog("Error performing query. \(error.debugDescription)")
return
}
self.objects = records!
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
插入单个对象时不应重新加载整个 tableView。只有当您知道所有数据都已更改时才这样做。
为所欲为,命令如下:
- 将新的数据对象插入您的数据源 (self.objects)。确保你得到它在数组中结束位置的索引。
- 调用 insertRowAtIndexPath: 在您的 tableView 上使用正确的 indexPath。这将确保您的数据和 tableView 再次同步,并且 tableView:cellForRowAtIndexPath: 至少为您的新数据对象(以及可能的其他数据对象,因为某些单元格现在可能被重新用于显示其他数据)被调用。
请注意,顺序始终是:先更新您的数据,然后更新您的 UI(我唯一知道他毛茸茸的地方是使用 UISwitch 时)。
我正在创建一个 cloudkit 表格视图。我加载了该应用程序,我的 tableview 出现了我从云工具包中输入的内容。
然后我使用我的添加方法 insertNewObject
将记录添加到云工具包,但这并没有显示在我的表视图中。它只会出现在我的下一个 运行 应用程序中。
func insertNewObject(sender: AnyObject) {
let record = CKRecord(recordType: "CloudNote")
record.setObject("New Note", forKey: "Notes")
MyClipManager.SaveMethod(Database!, myRecord:record)
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
这是我的添加方法。如您所见,我正在调用 tableview 重新加载,但没有任何反应。
我的表格视图创建代码:
// Tableview stuff --- Done
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
/////// Get number of rows
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
//// FIll the table
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let object = objects[indexPath.row]
cell.textLabel!.text = object.objectForKey("Notes") as? String
return cell
}
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
按要求:保存到CloudDB的方法
func SaveMethod(publicDatabase: CKDatabase, myRecord: CKRecord ) -> CKRecord {
publicDatabase.saveRecord(myRecord, completionHandler:
({returnRecord, error in
if let err = error {
self.notifyUser("Save Error", message:
err.localizedDescription)
} else {
dispatch_async(dispatch_get_main_queue()) {
self.notifyUser("Success",
message: "Record saved successfully")
}
}
}))
return myRecord
}
我在masterview中的viewdidload方法:
override func viewDidLoad() {
super.viewDidLoad()
// Database loading on runtime
Database = container.privateCloudDatabase
///Build Query
let query = CKQuery(recordType: "CloudNote", predicate: NSPredicate(format: "TRUEPREDICATE"))
///Perform query on DB
Database!.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in
if (error != nil) {
NSLog("Error performing query. \(error.debugDescription)")
return
}
self.objects = records!
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
插入单个对象时不应重新加载整个 tableView。只有当您知道所有数据都已更改时才这样做。
为所欲为,命令如下:
- 将新的数据对象插入您的数据源 (self.objects)。确保你得到它在数组中结束位置的索引。
- 调用 insertRowAtIndexPath: 在您的 tableView 上使用正确的 indexPath。这将确保您的数据和 tableView 再次同步,并且 tableView:cellForRowAtIndexPath: 至少为您的新数据对象(以及可能的其他数据对象,因为某些单元格现在可能被重新用于显示其他数据)被调用。
请注意,顺序始终是:先更新您的数据,然后更新您的 UI(我唯一知道他毛茸茸的地方是使用 UISwitch 时)。