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

我正在做一个项目,我有两个 UITableView和两个 UITextField,当用户按下按钮时,第一个 textField的数据应该进入 tableView,第二个进入第二个 tableView。我的问题是,我不知道如何把数据放在 tableView每次用户按下按钮,我知道如何插入数据与 tableView:cellForRowAtIndexPath:,但就我所知,一次工作。那么,我可以用什么方法来更新的 tableView每次用户点击按钮?

152212 次浏览

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

如@vadian 在注释中所说,begin/endUpdates对单个插入/删除/移动操作没有效果

首先,在表视图数组中追加数据

Yourarray.append([labeltext])

然后更新表并插入新行

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

这将插入单元格,并且不需要重新加载整个表,但是如果您在这方面遇到任何问题,也可以使用 tableview.reloadData()


Swift 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];

以下是向 tableView 和 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()
}
}

你的结果会是:

enter image description here

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()

为了 Swift 5

移除 Cell

    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()

你可以在苹果的 UITableView 框架中找到这条评论:

// Use -performBatchUpdates:completion: instead of these methods, which will be deprecated in a future release.

所以,你应该用这个:

tableView.performBatchUpdates { [unowned self] in
tableView.insertRows(at: indexPaths, with: animation)
}