我试图在原型单元格中创建一个只有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)
,它似乎无法从表格单元格调用。
答案 0 :(得分:0)
根据您设置UItableview
的方式,听起来您似乎想要获取正在注册警报的单元格数据的ID,然后更新按钮文本该单元格基于表视图渲染语句中的那个单元格。请记住,设置按钮的标签有一个动画,如果您同时为其他内容制作动画,可以会导致一些奇怪的事情发生。
您可能希望在表格视图中查看以下链接中的重新加载行。但请注意,如果您使用indexPath
,dequeueReusableCell
并不总是与调用用户互动时相同。
UITableView Reference
有关快速实施的信息,请参阅UIButton Reference,您必须将其设置为按钮的当前状态。