我有三个视图控制器。
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编写的。
答案 0 :(得分:2)
为什么不用相应的表为所有视图编写函数。
就像
导入基金会 导入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)调用它们.delegate = self
答案 1 :(得分:0)
您需要从数据源中删除数据并使用tableview.reloadData()
更新tableviewEDIT !!
当您导航回VC2(VC3-> VC2)时,您应该引用您删除的数据,以便可以从dataSource(数组,nsuserdefaults)中删除它。 这种方式当你想从VC2导航 - > VC3你将从NSUserDefaults带来一个新数组,然后用新数据重新加载tableview。
但我建议你让这个更简单。好像你在为自己制造麻烦。如果要使用来自多个viewControllers的数据访问数组,则应使用包含该数组的类创建一个新文件。看看这个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")
}
}
答案 2 :(得分:0)
最佳解决方案您的案例中的一个解决方案可能是使用通知模式。
从VC3课程发送通知:
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(VC1.objectDeleted(_:)),
name: "ObjectDeleted",
object: nil)
在你的VC1& VC2你必须订阅删除事件(某处 viewDidLoad())
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)
}
你可以像下面那样处理它:
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
对于VC2,您也可以在上面的函数中更新NSUserDefaults容器。
使用iOS 8或更早版本,您需要在取消分配观察者对象(在您的情况下为VC1或VC2)之前取消注册此通知。如果您忘记了当通知中心将下一个通知发送到不再存在的对象时,您将面临崩溃的风险。所以不要忘记添加一个deinit电话:
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8080
答案 3 :(得分:0)
删除后需要更新数据。
在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)
}
}
答案 4 :(得分:0)
第一件事是从填充tableView的数据源中删除数据。您最有可能拥有某些类/结构类型的数组,例如let usersArray = [Users]()
然后,您需要从tableView中删除该行。
注意!!!如果您使用重新加载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)