我有一个UITableViewCell
和一个UIViewController
。在UITableViewCell
中,我有一个步进器。当用户单击步进器以将值发送到主视图控制器并在我的表视图单元格中接收它时,该怎么做?
我试图从单元格中的步进器获取值,但是它不起作用。我的代码在下面。
首先:UITableViewCell
import UIKit
import HCSStarRatingView
import GMStepper
class FoodsSecoundTableViewCell: UITableViewCell {
@IBOutlet weak var foodTitle: UILabel!
@IBOutlet weak var foodPrice: UILabel!
@IBOutlet weak var foodRating: HCSStarRatingView!
@IBOutlet weak var foodImage: UIImageView!
@IBOutlet weak var steperCount: GMStepper!
var result : Double?
override func awakeFromNib() {
super.awakeFromNib()
print(steperCount.value) // this line has print the value just one time
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
@IBAction func myStepper(_ sender: Any) { // its a function
}
}
第二:主视图控制器
import UIKit
class FoodsViewController: UIViewController , UITableViewDataSource {
var foods = [Foods]()
@IBOutlet weak var myTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
foods = [Foods(name: "myData", price: 15, count: 0, description: "myData", time: "20 - 30 min", rating: 4, image: #imageLiteral(resourceName: "chick")),
Foods(name: "myData", price: 30, count: 0,description: "myData", time: "20 - 30 min", rating: 5, image: #imageLiteral(resourceName: "chick")),
Foods(name: "myData", price: 20,count: 0,description: "myData", time: "20 - 30 min", rating: 3, image: #imageLiteral(resourceName: "chick")),
Foods(name: "myData", price: 40,count: 0, description: "myData", time: "20 - 30 min", rating: 5, image: #imageLiteral(resourceName: "chick")),
Foods(name: "myData", price: 55, count: 0,description: "myData", time: "20 - 30 min", rating: 4, image: #imageLiteral(resourceName: "chick"))
]
myTable.rowHeight = 171
myTable.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return foods.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let food = foods[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "foods") as! FoodsSecoundTableViewCell
cell.foodImage.image = food.image
cell.foodPrice.text = String(food.price)
print(cell.steperCount.value) // the result hear : its print just for one time
cell.foodTitle.text = food.name
cell.foodRating.value = CGFloat(food.rating)
return cell
}
}
答案 0 :(得分:0)
您可以查看GMStepper中的示例代码。
在FoodsViewController
中,当您创建单元格时,将回调添加到steperCount
cell.steperCount.addTarget(self, action: #selector(FoodsViewController.stepperValueChanged), for: .valueChanged)
添加回调函数:
@objc func stepperValueChanged(stepper: GMStepper) {
print(stepper.value, terminator: "")
}
答案 1 :(得分:0)
一个不错的选择是使用“代理模式”。首先,定义您的VC遵循的协议,以便接收值更改事件:
protocol FoodsSecoundTableViewCellDelegate: class {
func stepper(_ stepper: GMStepper, at index: Int, didChangeValueTo newValue: Double)
}
在delegate
上添加UITableViewCell
属性,并在GMStepper
上更改值时调用委托方法:
class FoodsSecoundTableViewCell: UITableViewCell {
...
weak var delegate: FoodsSecoundTableViewCellDelegate?
...
@IBAction func myStepper(_ sender: Any) {
delegate?.stepper(stepper, at: stepper.tag, didChangeValueTo: stepper.value)
}
...
}
然后使您的VC符合FoodsSecoundTableViewCellDelegate
:
extension ViewController: FoodsSecoundTableViewCellDelegate {
func stepper(_ stepper: GMStepper, at index: Int, didChangeValueTo newValue: Double) {
print("Value changed in VC: \(newValue)")
// Process that change...
let indexPath = IndexPath(item: index, section: 0)
guard let cell = tableView.cellForRow(at: indexPath) as? FoodsSecoundTableViewCell else {
return
}
// Send the value back to the cell
}
}
最后,在建立表格视图时,设置步进器的委托和标签:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let food = foods[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "foods") as! FoodsSecoundTableViewCell
cell.foodImage.image = food.image
cell.foodPrice.text = String(food.price)
cell.foodTitle.text = food.name
cell.foodRating.value = CGFloat(food.rating)
cell.stepper.tag = indexPath.row
cell.delegate = self
return cell
}