swift - 如何通过单击表格视图中的按钮来添加其他文本字段
问题描述
我正在尝试添加一个选项以在表中添加其他学生字段,以便用户可以添加多个学生姓名。
但我很困惑如何使用表格视图来做到这一点。
我对隐藏具有特定数量字段的视图不感兴趣。
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
struct listItems{
var title : String
var isExpandable:Bool
var maxFields :Int
init(title:String,isExp:Bool,mxF:Int) {
self.title = title
self.isExpandable = isExp
self.maxFields = mxF
}
}
@IBOutlet weak var tblListTable: UITableView!
let data : [listItems] = [listItems(title: "Name", isExp: false, mxF: 1), listItems(title: "Student Name", isExp: true, mxF: 20), listItems(title: "Email", isExp: false, mxF: 1)]
override func viewDidLoad() {
super.viewDidLoad()
tblListTable.delegate = self
tblListTable.dataSource = self
self.tblListTable.reloadData()
print("isLoaded")
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("cellForRow")
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! ListCell
cell.lblName.text = data[indexPath.row].title
if data[indexPath.row].isExpandable == true {
cell.btnAddField.isHidden = false
print("ishidden")
}
else {
cell.btnAddField.isHidden = true
}
return cell
}
}
列出单元类
import UIKit
protocol AddFieldDelegate : class {
func addField( _ tag : Int)
}
class ListCell: UITableViewCell {
@IBOutlet weak var btnAddField: UIButton!
@IBOutlet weak var lblName: UILabel!
@IBOutlet weak var txtField: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func addField( _ tag : Int){
}
}
解决方案
您在创建AddFieldDelegate
. 但是,与其在ListCell
类中实现方法,不如在ViewController
.
首先,将视图控制器类定义行更改为:
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource, AddFieldDelegate {
这将允许您从视图控制器调用委托方法。接下来,当您创建表格视图单元格时,添加以下行:
cell.delegate = self
之后,将方法的方法定义移动addField
到视图控制器。所以在你的视图控制器里面添加:
func addField(titleOfTextFieldToAdd: String, numberAssociatedWithTextFieldToAdd: Int) {
data.append(listItems(title: titleOfTextFieldToAdd, isExp: false, mxF: numberAssociatedWithTextFieldToAdd))
self.tableView.reloadData()
}
我使用了该方法的示例定义,addField
但您可以将其更改为您想要的任何内容,只需确保更改数据数组并重新加载表视图数据。
ListCell
最后,我们必须在类中定义委托。所以将这一行添加到ListCell
类中:
weak var delegate: MyCustomCellDelegate?
然后,您可以通过在ListCell
类中的任何位置运行以下命令来添加文本字段:
delegate?.addField(titleOfTextFieldToAdd: "a name", numberAssociatedWithTextFieldToAdd: 50)
有关委托的更多信息,请查看此问题的答案。
推荐阅读
- python - 如何更有效地存储距离矩阵?
- java - EasyExcel 不弹出下载 excel 文件 UI
- linux - openwrt wifi udp 多播丢包和限速
- phpstorm - PhpStorm 中的多条垂直线以获得最大线长
- javascript - 如何在某个类jquery之外仅获取子元素
- c# - 最佳实践:来自异步处理的同步响应
- javascript - 如何首次将值存储到浏览器 localStorage?
- android - Android Studio-如何在应用程序关闭后以编程方式删除最近的应用程序列表
- json - 如何将 json 转换为具有单个标头和多个值的 csv?
- scala - 在 scala 中仅使用递归的单行循环