按下后退按钮时,UITableView中的数据会重复

时间:2016-10-27 10:50:54

标签: ios objective-c uitableview core-data swift3

我正在开发一个用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;
    }
}

2 个答案:

答案 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 = []