我正在开发一个用swift 3.0编写的项目。我的要求是保存我在某些文本字段中输入的数据(在CoreData上)并将其中一个属性填充到表视图中,因此一旦选择了一行,我想更新该记录(在我的文本字段上重新分配值)并保存)。
基本上我有一个名为" Task"的实体。它有三个属性,我想在核心数据中填充其中一个属性(称为" name")到表视图中。因此,当我想编辑我输入的数据时,我点击一行,它会将我引导到我最初输入这些数据的ViewController。但是,当我单击后退按钮而不保存数据时,它将复制数组并填充到我的表视图中。我怎么能阻止这个。表视图类的代码如下。
public enum BuildingType {
FARM(Farm.class), SHOP(Shop.class), HOUSE(House.class);
private final Class<? extends Building> buildingType;
private BuildingType(Class<? extends Building> buildingType ) {
this.buildingType = buildingType;
}
public Building getBuilding( Furniture... furniture ) {
Building building = null;
try {
Constructor<? extends Building> constructor =
( Constructor<? extends Building> ) buildingType.getDeclaredConstructor( Furniture[].class );
building = constructor.newInstance( furniture );
}
catch ( NoSuchMethodException | SecurityException |
InstantiationException | IllegalAccessException |
IllegalArgumentException | InvocationTargetException ex ) {
//I have a method to handle exceptions, you could do the same,
//but in principle it shouldn't be necessary.
//handleExceptionsGracefully(...);
}
return building;
}
}
答案 0 :(得分:2)
这种情况正在发生,因为已经加载的元素存在于数组中。当您回到之前加载的ViewController
方法viewWillAppear
时,viewDidAppear
会根据viewController's
生命周期每次调用。
当您回来时,需要使用removeAll()
方法清除以前加载的数组。
使用以下代码:
override func viewDidAppear(_ animated: Bool) {
stores.removeAll() // clears all element
let request = NSFetchRequest <NSFetchRequestResult> (entityName: "Store")
request.returnsObjectsAsFaults = false
do {
let results = try context.fetch(request) as! [Store]
// check data existance
if results.count>0 {
print(results.count)
for resultGot in results {
if let expName = resultGot.name {
print("expence name is :", expName)
stores += [resultGot]
print("my array is : \(stores)")
}
}
self.tableView.reloadData()
}
}catch{
print("No Data to load")
}
}
答案 1 :(得分:0)
在viewDidAppear
方法中填充tableView,每次显示视图时都会执行该方法(第一次或从另一个详细视图控制器返回)。
你要么
将填充代码移至viewDidLoad
或清除(从商店中删除所有对象)。所以在for resultGot in results
插入类似
的内容stores = []