Swift 单击按钮下方的 TableView 插入行

Swift TableView insert row below button clicked

我是 Swift 的新手,我正在使用 Swift 4.2。我有一个带有标签和按钮的 TableView。当我按下按钮时,我想在单击按钮的行的正下方添加一个新行。现在,当我单击一个按钮时,每次都会将新行添加到 TableView 的底部。我一直在看这里的帖子,但一直无法正常工作这是我的代码库。我有一个名为 RowClick 的方法,我得到了被单击行的索引路径,但不知道如何使用它来使新行直接出现在被单击行的下方。

class ExpandController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var TableSource: UITableView!


    var videos: [String] = ["FaceBook","Twitter","Instagram"]

    override func viewDidLoad() {
        super.viewDidLoad()
        TableSource.delegate = self
        TableSource.dataSource = self
        TableSource.tableFooterView = UIView(frame: CGRect.zero)
        // Do any additional setup after loading the view.
    }



    @IBAction func RowClick(_ sender: UIButton) {
        guard let cell = sender.superview?.superview as? ExpandTVC else {
            return
        }

        let indexPath = TableSource.indexPath(for: cell)
        InsertVideoTitle(indexPath: indexPath)
    }
    func InsertVideoTitle(indexPath: IndexPath?)
    {
        videos.append("Snapchat")
        let indexPath = IndexPath(row: videos.count - 1, section: 0)
        TableSource.beginUpdates()
        TableSource.insertRows(at: [indexPath], with: .automatic)
        TableSource.endUpdates()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return videos.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let videoTitle = videos[indexPath.row]
        let cell = TableSource.dequeueReusableCell(withIdentifier: "ExpandTVC") as! ExpandTVC
        cell.Title.text = videoTitle

        cell.ButtonRow.tag = indexPath.row
        cell.ButtonRow.setTitle("Rows",for: .normal)

        return cell
    }

}

这就是我的 table 的样子 我点击了 Facebook 行按钮,它附加了字符串 SnapChat 。 Snapchat 标签应该出现在 Facebook 下面的一行中。任何建议都会很棒!

我认为无需重新编写整个内容的最简单解决方案是将 1 添加到您从操作中捕获的 IndexPath 的当前行。

let indexPath = TableSource.indexPath(for: cell)
        var newIndexPath = indexPath;
        newIndexPath.row += 1;
        InsertVideoTitle(indexPath: newIndexPath);

我是凭记忆做的,因为我不在 IDE 附近,所以请查看更改并在需要时在任何其他位置应用该更改。

class ExpandController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    @IBOutlet weak var TableSource: UITableView!


    var videos: [String] = ["FaceBook","Twitter","Instagram"]

    override func viewDidLoad() {
        super.viewDidLoad()
        TableSource.delegate = self
        TableSource.dataSource = self
        TableSource.tableFooterView = UIView(frame: CGRect.zero)
        // Do any additional setup after loading the view.
    }



    @IBAction func RowClick(_ sender: UIButton) {
        guard let cell = sender.superview?.superview as? ExpandTVC else {
            return
        }

        let indexPath = TableSource.indexPath(for: cell)
        var newIndexPath = indexPath;
        newIndexPath.row += 1;
        InsertVideoTitle(indexPath: newIndexPath);
    }
    func InsertVideoTitle(indexPath: IndexPath?)
    {
        videos.append("Snapchat")
        let indexPath = IndexPath(row: videos.count - 1, section: 0)
        TableSource.beginUpdates()
        TableSource.insertRows(at: [indexPath], with: .automatic)
        TableSource.endUpdates()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return videos.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let videoTitle = videos[indexPath.row]
        let cell = TableSource.dequeueReusableCell(withIdentifier: "ExpandTVC") as! ExpandTVC
        cell.Title.text = videoTitle

        cell.ButtonRow.tag = indexPath.row
        cell.ButtonRow.setTitle("Rows",for: .normal)

        return cell
    }

}

您当前的代码调用 append 以在数组末尾添加新项目。您要做的是在 indexPath.row+1 处插入一个新行。 Array 有一个 insert(element,at:) 函数。

您必须处理用户点击最后一行而不加 1 以避免数组边界错误的情况:

func InsertVideoTitle(indexPath: IndexPath)
{
    let targetRow = indexPath.row < videos.endIndex ? indexPath.row+1 : indexPath.row 
    videos.insert("Snapchat" at:targetRow)
    let newIndexPath = IndexPath(row: targetRow, section: 0)
    TableSource.beginUpdates()
    TableSource.insertRows(at: [newIndexPath], with: .automatic)
    TableSource.endUpdates()
}