【问题标题】:How do I update a UIButton title in a custom cell from a modal UIView如何从模态 UIView 更新自定义单元格中的 UIButton 标题
【发布时间】:2019-01-12 03:12:35
【问题描述】:

我正在为我的一个朋友编写一个旧应用程序的克隆。应用程序中的一件事是点击自定义单元格中的“优先级”按钮,它会显示一个选择器视图,并更改按钮的标题以显示任务的优先级。

选择器:

选择器在 UIView 中作为模式。我想将选择器设置为我想要的数字,然后关闭模式并将按钮标题更改为我在选择器中选择的数字。我已经尝试了各种各样的事情,但我无法弄清楚如何去做。除了按钮是自定义表格视图单元格的一部分之外,它不会那么糟糕。我如何让它做到这一点?

MainListViewController:

import UIKit

var defaultCell = "defaultCell"
var itemIndex = 0
var testData: [String] = []
var listItem: [(priorityLevel: Int, itemText: String)] = []

class MainListViewController: UITableViewController, PriorityDelegate {
@IBOutlet weak var addButton: UIBarButtonItem!

var itemTF = UITextField()
var setIndex = 0

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return testData.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: defaultCell, for: indexPath) as! ListItemCell
    cell.itemLabel.text = testData[indexPath.row]
    cell.priorityButton.addTarget(self, action: #selector(priorityButtonClicked(sender:)), for: .touchUpInside)
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    itemIndex = indexPath.row
    performSegue(withIdentifier: "segueID", sender: self)
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return CGFloat(75)
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    guard editingStyle == .delete else {return}
    testData.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .automatic)
}

@IBAction func addButton(_ sender: UIBarButtonItem) {

    let alertController = UIAlertController(title: "Alert title", message: "Message to display", preferredStyle: .alert)

    alertController.addTextField { (itemTF) in itemTF.placeholder = "Enter your item" }

    // Create OK button
    let OKAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) in

        // Code in this block will trigger when OK button tapped.
        guard let itemText = alertController.textFields?.first?.text else {return}
        self.add(itemText)

    }
    alertController.addAction(OKAction)

    // Create Cancel button
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) /* {
        (action:UIAlertAction!) in print("Cancel button tapped"); // Uncomment to make Cancel button do stuff
    } */
    alertController.addAction(cancelAction)

    // Present Dialog message
    self.present(alertController, animated: true, completion:nil)
}

func add(_ newItem: String) {
    testData.insert(newItem, at: 0)
    let indexPath = IndexPath(row: 0, section: 0)
    tableView.insertRows(at: [indexPath], with: .left)
}

@objc func priorityButtonClicked(sender: UIButton) {
    print("Button pressed")
//        performSegue(withIdentifier: "segue", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segue" {
        let vc : PriorityViewController = segue.destination as! PriorityViewController
        vc.delegate = self
    }
}

func setPriorityLevel(level: Int) {
    print(level)
    // Need to refigure protocol
}
}

PriorityViewController(这有选择器):

import UIKit

protocol PriorityDelegate {
func setPriorityLevel(level: Int)
}

class PriorityViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var priorityPicker: UIPickerView!
@IBOutlet weak var savePriorityButton: UIButton!

var priorityChosen = ""
var priorityIndex = 0
var delegate : PriorityDelegate?

let priorityLevel = ["1", "2", "3", "4", "5"]

override func viewDidLoad() {
    super.viewDidLoad()
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return priorityLevel.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return priorityLevel[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
//        priorityChosen = priorityLevel[row]
    priorityIndex = row
}

@IBAction func savePriority(_ sender: UIButton) {
    if delegate != nil {
        delegate?.setPriorityLevel(level: priorityIndex)
    }

    dismiss(animated: true)
}
}

ListItemCell:

import UIKit


class ListItemCell: UITableViewCell {

@IBOutlet weak var priorityButton: UIButton!
@IBOutlet weak var itemLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

【问题讨论】:

标签: ios swift


【解决方案1】:

好的,我终于让它工作了!我从几个不同的来源拼凑了一些东西,这就是我想出的。我希望这可以帮助其他人,因为我找不到如何做到这一点。

My GitHub for this project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多