![](/img/trans.png)
[英]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.