需要一点帮助
我的NavigationController
中有一个添加按钮,用于插入新的CustomTableviewCell
,自定义的tableview单元格由TextField
组成。我已经能够成功添加新单元格,但是我无法获取每个文本字段中的所有文本并将它们附加到数组中。
var datas: [String] = [""]
static var username = ""
@IBAction func addNewName(_ sender: Any) {
self.isHandlingAddNewUser = true
datas.insert(ViewController.username, at: 0)
tableView.beginUpdates()
tableView.insertRows(at: [IndexPath.init(row: 0, section: 0)], with: .automatic)
tableView.endUpdates()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datas.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserInputCell
if let name = cell.usernameTextField.text{
ViewController.username = name
}
return cell
}
我缺少什么,我尝试打印datas
,都是空的
答案 0 :(得分:1)
您没有将数据分配给单元格本身。 我想你应该这样做:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserInputCell
cell.usernameTextField.text = datas[indexPath.row]
return cell
}
我不确定您使用username
变量尝试实现的目标,但我确定它不应该使用单元格配置方法
答案 1 :(得分:0)
您不应该在cellForRowAt
中更新模型。这应该只填充单元格的文本字段的初始值。如果要查找有关更改的信息,则需要为单元格设置另一种机制,以便在文本字段更改时通知视图控制器。
基本思路如下:
定义协议(我称之为UserInputCellDelegate
),通过该协议,单元格可以通知视图控制器更改;
cellForRowAt
只应使用模型中的值(您的datas
)更新单元格中的文本字段。它还将视图控制器定义为单元格的委托(以接收有关更改值的更新);
更新文本字段时(例如,连接IBOutlet
以进行"编辑确实结束"),单元格将通过调用委托来通知视图控制器该更改通知视图控制器更改的方法。
当视图控制器调用didUpdate
时,它会相应地更新模型。
因此:
class ViewController: UITableViewController {
var datas = [String]() // start with empty array
@IBAction func didTapAddButton(_ sender: Any) {
let indexPath = IndexPath(row: 0, section:0)
datas.insert("", at: indexPath.row) // inserting default value (I'm inserting ""; you can insert whatever you want)
tableView.insertRows(at: [indexPath], with: .automatic)
}
}
// MARK: - UITableViewDataSource
extension ViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datas.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserInputCell
cell.delegate = self
cell.usernameTextField.text = datas[indexPath.row]
return cell
}
}
// MARK: - UserInputCellDelegate
extension ViewController: UserInputCellDelegate {
func didUpdate(cell: UserInputCell, string: String?) {
if let indexPath = tableView.indexPath(for: cell) {
datas[indexPath.row] = string ?? "" // update `datas` with value user edited
}
// For giggles and grins, let's print the array, so we can see what it's doing.
// In production app, this `print` statement would be removed.
print("\(datas)")
}
}
和
protocol UserInputCellDelegate: class { // this is class protocol, to allow weak reference
/// When text field is updated, cell calls this delegate method to inform it of changes
/// to text field value.
///
/// - Parameters:
/// - cell: Cell containing text field that was updated
/// - string: String value entered.
func didUpdate(cell: UserInputCell, string: String?)
}
class UserInputCell: UITableViewCell, UITextFieldDelegate {
weak var delegate: UserInputCellDelegate? // note this is weak to avoid strong reference cycle
@IBOutlet weak var usernameTextField: UITextField!
// hooked up to "Editing did end" action for text field in IB
@IBAction func didEndEditing(_ sender: UITextField) {
delegate?.didUpdate(cell: self, string: sender.text)
}
}
答案 2 :(得分:0)
var row = ["One", "Two", "Three"]
@IBAction func addRow(sender: AnyObject) {
row.append("Four")
tableView.reloadData()
}