如何在表格视图中使用where按钮在表格视图单元格之间进行数据转换?

时间:2019-03-04 06:43:46

标签: ios swift uitableview

我有两个自定义表格视图。我需要将DestinationTableView的第一个和第二个单元格数据传递到MyCartTableView的第一个单元格。如何在带有tableView外部的这两个表视图单元格之间进行转换。

我做了tableView.indexPathForSelectedRow,但是这次我需要在tableView之外使用UIButton

以下是通过tableView单元格触发的。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "cellForFoodSegue" {
        if let destinationViewController = segue.destination as? DetailViewController
        {
            let indexPath = self.mainTableView.indexPathForSelectedRow!

            var foodNameArray: String
            var foodPriceArray: Double

            foodNameArray = foodNames[indexPath.row]
            foodPriceArray = foodPrices[indexPath.row].purchaseAmount

            destinationViewController.detailFoodName = foodNameArray
            destinationViewController.detailFoodPrice = foodPriceArray

        }

    }
}

我尝试了下面的代码,但没有成功通过按钮传递数据。

@IBAction func addBasket(_ sender: Any) {

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "addToCartSegue") {


        if let addToCartVC = segue.destination as? MyCartViewController {

            let selectedCell = sender as! UITableViewCell
            let indexPath = self.detailTableView.indexPath(for: selectedCell)

           var foodNameArray: String
           var foodPriceArray: Double

           foodNameArray = foodNames[indexPath.row]
           foodPriceArray = prices[indexPath.row].purchaseAmount

           addToCartVC.fromDetailFoodName = foodNameArray
            addToCartVC.fromDetailFoodPrice = prices[(indexPath?.row)!].purchaseAmount

        }
    }
}

在我的MyViewController代码下面。点按addBasket按钮

是我添加的对象
class MyCartViewController: UIViewController, UITableViewDataSource,  UITableViewDelegate {

var fromDetailFoodName: [String?] = []
var fromDetailFoodPrice =  Double()

var nameLabel = MyCartTableViewCell()

@IBOutlet weak var myCartTableView: UITableView!
@IBOutlet weak var totalPriceLabel: UILabel!

let foodNames = [
    "Hamburger big mac",
    "Cemal",
    "Emre",
    "Memo"
]

//TODO-: Delete my cart
@IBAction func deleteMyCart(_ sender: Any) {
}

//TODO: - Approve my  cart
@IBAction func approveCart(_ sender: Any) {
}


override func viewDidLoad() {
    super.viewDidLoad()


}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return section == 0 ? 1 : foodNames.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCartCell", for: indexPath) as! MyCartTableViewCell
    cell.myCartFoodNameLabel?.text = fromDetailFoodName.description
    cell.myCartFoodPriceLabel?.text = "\(fromDetailFoodPrice)₺"
    return cell
}
}

1 个答案:

答案 0 :(得分:1)

您应该获取要在func addBasket(_ sender: Any)中传递的数据的索引路径。 例如,您可以将索引路径另存为类中引用的属性。

class StartViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

  var selectedIndexPath: IndexPath?

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    selectedIndexPath = indexPath
  }

  @IBAction func addBasket(_ sender: Any) {
    if let indexPath = selectedIndexPath {
      let destinationVC = MyCartViewController()
      destinationVC.detailFoodName = foodNames[indexPath.row]
      destinationVC.detailFoodPrice = foodPrices[indexPath.row].purchaseAmount
    }
  }
}

MyCartViewController中,它是目标VC。

class MyCartViewController: UIViewController, UITableViewDataSource,  UITableViewDelegate {

  var fromDetailFoodNames: [String?] = []
  var fromDetailFoodPrices:  [Double?] = []

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 1 && indexPath.last! <= fromDetailFoodPrices.indices.last! {
      let cell = myCartTableView.dequeueReusableCell(withIdentifier: "myCartCell", for: indexPath) as! MyCartTableViewCell
      let name = fromDetailFoodNames[indexPath.row]?.description ?? ""
      let price = fromDetailFoodPrices[indexPath.row]
      cell.myCartFoodNameLabel?.text = name
      cell.myCartFoodPriceLabel?.text = "\(price)₺"
      return cell
    }
  }
}

顺便说一句,为了获得更好的编码,您可以在代码中实现OOP概念。 detailFoodName和detailFoodPrice应该在一个对象中。此外,var foodNameArray: String的命名可能会造成混淆。将其重命名为var foodName: String会更好。