如何防止TableView单元格重复?迅速

时间:2015-12-06 05:21:29

标签: ios swift nskeyedarchiver

所以我正在构建一个笔记应用程序,并尝试了一切,但无法解决这个问题。我有3 UIViewController个。当您点击第一个UIViewController上的按钮时,它会将您射到第三个按钮,其中包含UITextViewUITextField和静态UILabel,其中包含一些更新信息。当您填写这些字段并点击后退按钮时,它会将您带到第二个视图控制器,该控制器是一个使用此信息进行更新的表。

问题是:当我点击UITableViewCell时,它会将信息加载回第三个视图控制器,以便用户可以编辑他的笔记,但当我回到UITableView时,它会创建一个全新的单元格而不仅仅是更新旧单元格。

如果我可以使用我发回的相同对象更新我的数组,我认为这个问题会解决,但我不知道如何做到这一点。谢谢你的帮助!

VC2 - 这就是我将数据从tableView发送到textView Back

的方式
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    let nextView = segue.destinationViewController as! TextViewController

    guard let indexPath = self.tableView.indexPathForSelectedRow else {
        print("Didnt work")
        return
    }

    let dataToSendBackToBeEdited = textViewObjectData[indexPath.row]

    print(dataToSendBackToBeEdited.dreamText)
    print(dataToSendBackToBeEdited.dreamTitle)
    print(dataToSendBackToBeEdited.dreamType)
    print(dataToSendBackToBeEdited.description)
    print(dataToSendBackToBeEdited)

    nextView.objectSentFromTableViewCell = dataToSendBackToBeEdited
}

这就是我保存用户点击回到tableView

的信息的方法
func determineSave() {

    guard var savedDreamArray = NSKeyedUnarchiver.unarchiveObjectWithFile(TextViewController.pathToArchieve.ArchiveURL.path!) as? [Dream] else {

        //First dream object saved
        let dreamObject = Dream(dreamTitle: titleForDream.text!, dreamType: typeOfDreamLabel.text!, dreamText: textView.text, currentDate: NSDate())
        dreamArray.append(dreamObject)
        NSKeyedArchiver.archiveRootObject(dreamArray, toFile: pathToArchieve.ArchiveURL.path!)

        return
    }

    //print(savedDreamArray.count)
    //print(savedDreamArray.first!.dreamTitle)


    let dreamObject = Dream(dreamTitle: titleForDream.text!, dreamType: typeOfDreamLabel.text!, dreamText: textView.text!, currentDate: NSDate())


    savedDreamArray.append(dreamObject)
    NSKeyedArchiver.archiveRootObject(savedDreamArray, toFile: pathToArchieve.ArchiveURL.path!)

}

2 个答案:

答案 0 :(得分:2)

我也有这个问题。来到这里,得到了答案。阵列!

我也附加了数组,这显然导致重复的单元格出现。

我再次将数组重置为空,然后再次检索数据并重新加载表。

我使用的是Firebase,因此我的代码如下所示:

DataService.instance.dateProfileRef.observeEventType(FIRDataEventType.Value) { (snapshot: FIRDataSnapshot)
        in

        //have to clear the array here first before reloading the data. otherwise you get duplicates
        self.posts = []    //added this line
        if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshot {
                let snapUserID = (snap.childSnapshotForPath("userID").value!)

                if snapUserID as? String == USER_ID {
                if let profileDict = snap.value as? Dictionary<String, AnyObject> {

                    let key = snap.key
                    let post = Post(postKey: key, postData: profileDict)

                        self.posts.append(post)

答案 1 :(得分:0)

您在阵列上执行.append(),这将添加一个新单元格。

您必须找到要更新的对象的索引,然后分配它: array[index] = newObject