我正在尝试在原型单元格中创建一个只有1个标签和1个按钮的表格视图。
单击该按钮时,它会要求用户输入文本,然后使用该文本替换同一单元格中的标签。我已经能够创建一个版本,按下按钮可以使用预定文本更新相应的标签,但不能输入文本。
问题是:
(a)似乎无法在我创建的TableViewCell
类中运行要求用户输入的警报 - 必须在ViewController
中才能做到这一点吗?
(b)已经设置了TableCellDelegate
协议,并且可以检测到按下按钮,然后传回ViewController以运行警报,但无法找到将文本输入发送回TableViewCell
进行更新的方法。
任何帮助,将不胜感激。
这是ViewController代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
extension ViewController: TableCellDelegate {
func didTapButton(label: String) {
print(label)
}
}
extension ViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell") as! TableViewCell
let label = "Label " + String(indexPath.row)
cell.setLabel(label: label)
cell.delegate = self
return cell
}
}
这是TableViewCell(没有警报编码):
import UIKit
protocol TableCellDelegate {
func didTapButton (label: String)
}
class TableViewCell: UITableViewCell {
@IBOutlet weak var tableCellLabel: UILabel!
var delegate: TableCellDelegate?
func setLabel(label: String) {
tableCellLabel.text = label
}
@IBAction func buttonTapped(_ sender: Any) {
delegate?.didTapButton(label: tableCellLabel.text!)
tableCellLabel.text = "pressed"
}
}
最后,这里是我试图插入的警报代码,代替上面的tableCellLabel.text = "pressed"
代码:
// Create the alert window
let buttonAlert = UIAlertController(title: "Label", message: "Enter Label", preferredStyle: UIAlertControllerStyle.alert)
// Add text input field to alert controller
buttonAlert.addTextField { (buttonLabel:UITextField!) -> Void in
buttonLabel.placeholder = "Enter Label"
}
// Create alert action for OK button
let okButtonAction = UIAlertAction.init(title: "OK", style: UIAlertActionStyle.default) { (alert:UIAlertAction!) -> Void in
// Get the button name from the alert text field
let buttonLabel = buttonAlert.textFields![0]
let buttonLabelString = buttonLabel.text
self.tableCellLabel.text = buttonLabelString
// Dismiss alert if ok pressed
buttonAlert.dismiss(animated: true, completion: nil)
}
// Add ok Button alert actions to alert controller
buttonAlert.addAction(okButtonAction)
// Create alert action for a cancel button
let cancelAction = UIAlertAction.init(title: "Cancel", style: UIAlertActionStyle.cancel) { (alert:UIAlertAction!) -> Void in
// Dismiss alert if cancel pressed
buttonAlert.dismiss(animated: true, completion: nil)
}
// Add Cancel Button alert actions to alert controller
buttonAlert.addAction(cancelAction)
// Display the alert window
self.present(buttonAlert, animated: true, completion: nil)
这出错的地方是self.present(buttonAlert, animated: true, completion: nil)
,它似乎不能从表格单元格调用。
根据你如何设置UItableview
,听起来你想要获取正在注册警报的单元格数据的id,然后根据表格视图中的按钮文本更新该单元格中的按钮文本渲染声明。请记住,设置按钮的标签有一个动画,如果你同时动画其他东西,它可能会导致一些奇怪的事情发生。
您可能希望在表视图中查看下面链接中的重新加载行。但要小心,如果你使用indexPath
,dequeueReusableCell
并不总是与调用用户交互时相同。 UITableView Reference
请参阅UIButton Reference以获得快速实现,您必须将其设置为按钮的当前状态。