如何在Swift中将新单元格插入UITableView


72

我正在一个有两个UITableViews和两个UITextFields的项目中工作,当用户按下按钮时,第一个中的数据textField应进入tableView,第二个中的数据应进入第二个tableView。我的问题是,我不知道tableView每次用户按下按钮时都如何放入数据,我知道如何插入数据,tableView:cellForRowAtIndexPath:但是据我所知,这种方法只能工作一次。那么,tableView每当用户按下按钮时,我可以使用什么方法来更新?


你尝试了什么?您说“ tableView:cellForRowAtIndexPath:”仅在您知道的范围内起作用。为什么不尝试使用按钮的方法呢?
马克斯·冯·希佩尔

1
@Max von Hippel我当时所做的是:tableView从数组中获取数据,所以当我将一个项目附加到数组时,我会使用此方法:tableView.reloadData这样,当我附加一个项目时,该数组就会进入“ CellForRowAtIndexPath” ”,然后再次从数组中提取信息:)
代码Horizo​​ns'Aug

Answers:


171

单击按钮时,使用beginUpdatesendUpdates插入新单元格。

首先在tableview数组中追加数据

Yourarray.append([labeltext])  

然后更新表格并插入新行

// Update Table Data
tblname.beginUpdates()
tblname.insertRowsAtIndexPaths([
NSIndexPath(forRow: Yourarray.count-1, inSection: 0)], withRowAnimation: .Automatic)
tblname.endUpdates()

这将插入单元格,不需要重新加载整个表,但是如果对此有任何疑问,也可以使用 tableview.reloadData()


斯威夫特3.0

tableView.beginUpdates()
tableView.insertRows(at: [IndexPath(row: yourArray.count-1, section: 0)], with: .automatic)
tableView.endUpdates()

目标C

[self.tblname beginUpdates];
NSArray *arr = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:Yourarray.count-1 inSection:0]];
[self.tblname insertRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tblname endUpdates];

3
很高兴您也提供了Objective-C版本。有时会有所帮助!
Rashmi Ranjan mallick

1
@RashmiRanjanmallick ...是的,我也想过并编辑我的答案...所以人们理解了翻译:)
EI队长v2.0 2015年

7
begin/endUpdates对单个插入/删除/移动操作无效。
vadian

1
@vadian hmm ...多数民众赞成在我的想法...但是你begin/endUpdates has no effect for a single insert/delete/move operation这句话是什么意思?很抱歉有太多问题..
EI船长v2.0

3
没有效果意味着线是否存在没有差异。您仅需要一条线,例如一条insert线后接一条delete线或在重复循环中多次调用同一条线。
瓦迪安

27

Swift 5.0、4.0、3.0更新了解决方案

在底部插入

self.yourArray.append(msg)

self.tblView.beginUpdates()
self.tblView.insertRows(at: [IndexPath.init(row: self.yourArray.count-1, section: 0)], with: .automatic)
self.tblView.endUpdates()

插入TableView的顶部

self.yourArray.insert(msg, at: 0)
self.tblView.beginUpdates()
self.tblView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic)
self.tblView.endUpdates()

集合视图如何实现?我可以轻松插入多个项目...。但是这是在索引0处插入的。选择该项目时,将显示先前的索引0。
scrainie '17

22

这是将数据添加到两个tableView中的代码:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var table1Text: UITextField!
    @IBOutlet weak var table2Text: UITextField!
    @IBOutlet weak var table1: UITableView!
    @IBOutlet weak var table2: UITableView!

    var table1Data = ["a"]
    var table2Data = ["1"]

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func addData(sender: AnyObject) {

        //add your data into tables array from textField
        table1Data.append(table1Text.text)
        table2Data.append(table2Text.text)

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            //reload your tableView
            self.table1.reloadData()
            self.table2.reloadData()
        })


        table1Text.resignFirstResponder()
        table2Text.resignFirstResponder()
    }

    //delegate methods
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == table1 {
            return table1Data.count
        }else if tableView == table2 {
            return table2Data.count
        }
        return Int()
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        if tableView == table1 {
            let cell = table1.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

            let row = indexPath.row
            cell.textLabel?.text = table1Data[row]

            return cell
        }else if tableView == table2 {

            let cell = table2.dequeueReusableCellWithIdentifier("Cell1", forIndexPath: indexPath) as! UITableViewCell

            let row = indexPath.row
            cell.textLabel?.text = table2Data[row]

            return cell
        }

        return UITableViewCell()
    }
}

您的结果将是:

在此处输入图片说明


情节提要如何布置?
萨米

我问的原因是我正在尝试做类似的事情,并且在控制台中收到一条消息,通知我该表视图被迫调整大小
Sami

这很有帮助。谢谢。
rak appdev

参考您的答案,我可以问与添加部分和移动行有关的问题吗?
新手

0

对于Swift 5

移除细胞

    let indexPath = [NSIndexPath(row: yourArray-1, section: 0)]
    yourArray.remove(at: buttonTag)
    self.tableView.beginUpdates()

    self.tableView.deleteRows(at: indexPath as [IndexPath] , with: .fade)
    self.tableView.endUpdates()
    self.tableView.reloadData()// Not mendatory, But In my case its requires

添加新单元格

    yourArray.append(4)

    tableView.beginUpdates()
    tableView.insertRows(at: [
        (NSIndexPath(row: yourArray.count-1, section: 0) as IndexPath)], with: .automatic)
    tableView.endUpdates()

1
为什么创建一个NSIndexPath然后将其转换为IndexPath?最初只需创建一个IndexPath。我通常做的更简单:[0, 1]。零是节,1是行。
Starsky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.