【问题标题】:How can I prevent TableView cells from duplicating? Swift如何防止 TableView 单元格重复?迅速
【发布时间】:2015-12-06 05:21:29
【问题描述】:

所以我正在构建一个笔记应用程序并尝试了所有方法但无法解决这个问题。我有 3 个UIViewController。当您单击第一个UIViewController 上的按钮时,它会将您转到第三个,其中包含UITextView、UITextField 和静态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!)

}

【问题讨论】:

  • @bobby - 当我点击返回按钮时,我正在将我的对象附加到一个数组中。当用户编辑笔记时,我只是不知道如何获取该索引和该特定对象。我理解它背后的理论,但我不能自己写。任何帮助都会很棒!

标签: ios swift nskeyedarchiver


【解决方案1】:

我也遇到了这个问题。来到这里,得到了答案。数组!

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

我只是在再次检索数据并重新加载表之前将数组重置为空。

我正在使用 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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2019-11-10
      • 2016-05-13
      相关资源
      最近更新 更多