带有按钮的表视图,可根据用户输入更改标签

时间:2018-03-04 04:33:32

标签: ios swift uitableview delegates uialertcontroller

我试图在原型单元格中创建一个只有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),它似乎无法从表格单元格调用。

1 个答案:

答案 0 :(得分:0)

根据您设置UItableview的方式,听起来您似乎想要获取正在注册警报的单元格数据的ID,然后更新按钮文本该单元格基于表视图渲染语句中的那个单元格。请记住,设置按钮的标签有一个动画,如果您同时为其他内容制作动画,可以会导致一些奇怪的事情发生。

您可能希望在表格视图中查看以下链接中的重新加载行。但请注意,如果您使用indexPathdequeueReusableCell并不总是与调用用户互动时相同。 UITableView Reference

有关快速实施的信息,请参阅UIButton Reference,您必须将其设置为按钮的当前状态。