Ios 向表视图添加项时遇到问题

Ios 向表视图添加项时遇到问题,ios,swift,Ios,Swift,我试图在一个tableview单元格中添加3个项目,现在它只需从第一个文本字段打印项目三次,就像图片中一样,我需要它打印第一个项目,然后是第二个项目,然后是第三个项目。我不知道我做错了什么,当我点击添加按钮时,应用程序也完全崩溃了 因此,我的理解是,您希望:- 您从一个空列表开始 当用户按下“添加”按钮时,三个条目将添加到列表中 下表更新了三个额外条目。。。还是应该是一个条目加上三个条目 让我们看第一种情况,即您想要添加三行。为此,您将正确地向videos数组添加三行,并且数据源扩展是正确的

我试图在一个tableview单元格中添加3个项目,现在它只需从第一个文本字段打印项目三次,就像图片中一样,我需要它打印第一个项目,然后是第二个项目,然后是第三个项目。我不知道我做错了什么,当我点击添加按钮时,应用程序也完全崩溃了


因此,我的理解是,您希望:-

  • 您从一个空列表开始
  • 当用户按下“添加”按钮时,三个条目将添加到列表中
  • 下表更新了三个额外条目。。。还是应该是一个条目加上三个条目
  • 让我们看第一种情况,即您想要添加三行。为此,您将正确地向
    videos
    数组添加三行,并且
    数据源
    扩展是正确的(尽管具有相同值的三个文本字段的有用性值得怀疑)。您的错误是在表更新中-您告诉它,一个额外的行与行一起添加:

    let indexPath = IndexPath(row: videos.count - 1, section: 0)
    tableView.beginUpdates()
    tableView.insertRows(at: [indexPath], with: .automatic)
    tableView.endUpdates()
    
    如果要添加三行,则需要告诉它已添加三行,即:-

    let indexPath1 = IndexPath(row: videos.count - 3, section: 0)
    let indexPath2 = IndexPath(row: videos.count - 2, section: 0)
    let indexPath3 = IndexPath(row: videos.count - 1, section: 0)
    tableView.beginUpdates()
    tableView.insertRows(at: [indexPath1, indexPath2, indexPath3], with: .automatic)
    tableView.endUpdates()
    
    另一方面,如果只希望添加一行,其中包含所有三行,则行:-

    videos.append(addVideoTextField.text!)
    videos.append(addVideoTextField2.text!)
    videos.append(addVideoTextField3.text!)
    
    这是不正确的。相反,您需要使用一个结构来包含条目,并创建一个新实例并将其添加到
    视频中。例如,制作一个结构:-

    struct VideoRow
    {
      var first: String
      var second: String
      var third: String
    }
    
    将此作为数据源,即将您的声明更改为:-

    var videos: [VideoRow] = []
    
    在插入函数中添加:-

    let newVideoRow = VideoRow(first: addVideoTextField.text!, second: addVideoTextField2.text!, third: addVideoTextField3.text!)
    videos.append(newVideoRow)
    
    您的
    cellForRowAt
    将变成:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let videoTitle = videos[indexPath.row]
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell") as! VideoCell
        cell.videoTitle.text = videoTitle.first
        cell.videoTitle2.text = videoTitle.second
        cell.videoTitle3.text = videoTitle.third
        return cell
    }
    

    你的意思是通过应用程序启动/设备电源循环永久性地使用吗?这是另一个需要单独问的问题,但这里对您来说最简单的方法可能是通过
    UserDefaults
    。我更新了代码,在cellForRowAt中的“线程1:致命错误:在展开可选值时意外发现了nil”,该行显示“let cell=”我不是有意要改变你原来的台词。你刚刚编辑过它吗?我肯定我只是复制了你现有的代码?没有,我更改了它,我只是不知道如何用user defalts保存它。请允许这个问题开始(),问一个有问题的新问题。
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        let videoTitle = videos[indexPath.row]
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell") as! VideoCell
        cell.videoTitle.text = videoTitle.first
        cell.videoTitle2.text = videoTitle.second
        cell.videoTitle3.text = videoTitle.third
        return cell
    }