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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有按钮的表视图,可根据用户输入更改标签相关的知识,希望对你有一定的参考价值。

我正在尝试在原型单元格中创建一个只有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,然后根据表格视图中的按钮文本更新该单元格中的按钮文本渲染声明。请记住,设置按钮的标签有一个动画,如果你同时动画其他东西,它可能会导致一些奇怪的事情发生。

您可能希望在表视图中查看下面链接中的重新加载行。但要小心,如果你使用indexPathdequeueReusableCell并不总是与调用用户交互时相同。 UITableView Reference

请参阅UIButton Reference以获得快速实现,您必须将其设置为按钮的当前状态。

以上是关于带有按钮的表视图,可根据用户输入更改标签的主要内容,如果未能解决你的问题,请参考以下文章

没有视图的片段在配置更改时崩溃

UIScrollView 在用户更改视图时卡住

根据标签更改特定命令按钮的标题

根据用户输入动态更改标签文本

根据另一个视图控制器更改 viewController BG 颜色

将一个片段调用到另一个片段时更改标题TextView