如何解析从UITableViewCell到主View控制器的值(步进)?

时间:2019-03-04 00:28:51

标签: ios swift xcode uitableview

我有一个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
    }
}

2 个答案:

答案 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
}