[英]How to select another row right after deleting row in tableView (Swift)
[英]How to refresh tableview after deleting row in swift?
我有三個視圖控制器。
VC1和VC3是UITableViewControllers子類,VC2是UIViewController子類。
VC1將一些數據傳遞給VC2。 VC2使用userdefaults將數據保存到數組。 然后,VC2使用segue將此數據傳遞給VC3。 VC3以表格視圖顯示數據。
我添加了滑動手勢以從VC3的表視圖中刪除數據。 而且效果很好。 但是當我返回(VC3-> VC2)並再次返回(VC2-> VC3)時,已刪除的行仍然存在數據。 但是當我轉到VC3-> VC2-> VC1並再次返回VC1-> VC2-> VC3時,我發現刪除的行實際上已刪除。 我想當VC3> VC2然后VC2> VC3時將不存在已刪除的數據。
所有視圖控制器都在UINavigationController堆棧中。 代碼是用Swift 2編寫的。
為什么不為具有相應表的所有視圖編寫函數。
就像是
導入Foundation導入UIKit
class DeleteRows{
class func removeRowAtIndexPath(indexPathRow: Int, indexPathSec: Int, table: UITableView) -> UITableView{
arrayOfSomethin.removeAtIndex(indexPathRow)
let index = NSIndexPath(forItem: indexPathRow, inSection: indexPathSec)
table.deleteRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Left)
return table
}
}
您可以通過DeleteRows.removeRowAtIndexPath(indexPathRow:0,indexPathSec:0,table:Yourtable)來調用它們。
您需要從數據源中刪除數據,並使用tableview.reloadData()更新tableview
編輯!!
當您導航回VC2(VC3-> VC2)時,應該引用刪除的數據,以便可以從dataSource(array,nsuserdefaults)中刪除該數據。 這樣,當您要從VC2-> VC3導航時,您將從NSUserDefaults中獲取一個新的數組,然后使用該新數據重新加載tableview。
但我建議您為您簡化此過程。 看來您正在為自己制造麻煩。 如果要使用來自多個viewController的數據訪問數組,則應使用包含該數組的類制作一個新文件。 看一下下面的sudo代碼:
"dataSource.swift"
Class DataSource{
var arrayWithData = [String]()
init(){
let userDefault = NSUserDefaults.standardUserDefaults()
self.arrayWithData = userDefaults.arrayForKey("arrayData")
}
func deleteData(){
//Edit the self.arrayWithData and then run this method
let userDefault = NSUserDefaults.standardUserDefaults()
userDefault.updateValue(self.arrayWithData, forKey "arrayData")
}
}
最佳解決方案 您所遇到的解決方案之一可能是使用通知模式。
從您的VC3類發送通知:
NSNotificationCenter.defaultCenter().postNotificationName("ObjectDeleted", object: ["object" : object])
在VC1和VC2中,您必須訂閱刪除事件(在viewDidLoad()的某個位置)
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(VC1.objectDeleted(_:)),
name: "ObjectDeleted",
object: nil)
您可以像這樣處理它:
func objectDeleted(notification: NSNotification) {
guard let object = userInfo["object"] as? YourObjectClass else { return }
guard let index = dataArray.indexOf(object) else { return }
dataArray.removeAtIndex(index)
tableView.deleteRowsAtIndexPaths([NSIndexPath.init(forRow: index, inSection: 0)], withRowAnimation: .Automatic)
}
對於VC2,您還可以在上面的函數中更新NSUserDefaults容器。
使用iOS 8或更早版本,您需要先取消注冊此通知,然后再釋放觀察者對象(在您的情況下為VC1或VC2)。 如果您忘記了通知中心將下一個通知發送給不再存在的對象的話,就有崩潰的危險。 因此,不要忘記添加一個deinit調用 :
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
刪除后,您將需要更新數據。
在viewDidLoad()或delete方法的末尾,添加:
tableview.reloadData()
這應該有助於更新視圖。
要存儲/保留數據,請使用UserDefaults。
func storeData(name: String) {
let defaults = UserDefaults.standard
defaults.set(name, forKey: "Name")
defaults.synchronize() // Save Data
}
func getData() -> String {
if let name = UserDefaults.standard.object(forKey: "Name") {
return name as! String
} else {
return "" // error in retrieving data (ex: name not found)
}
}
第一件事是從填充tableView的數據源中刪除數據。 您最有可能擁有某些類/結構類型的數組,例如let usersArray = [Users]()
然后,您需要從tableView中刪除該行。
注意!!! 如果您使用reload tableView.reloadRows(at: [indexPath], with: .automatic)
則應用程序將崩潰。 此方法的作用就像您要插入一行,但是您的數據源告訴您該特定索引沒有數據,因此應使用table.deleteRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Left)
//remove users from dataSource
usersArray.remove(at:indexPath.row)
//delete the row of the tableView
table.deleteRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Left)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.