【发布时间】: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
}
}
【问题讨论】: