如何从弹出视图控制器获取数据到自定义表格视图单元格? [英] How to get data from popup view controller to custom table view cell?

查看:34
本文介绍了如何从弹出视图控制器获取数据到自定义表格视图单元格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 3 个视图控制器.首先是 MainViewController.

I have 3 view controllers. First is MainViewController.

在这个 MainViewController 中有自定义表格视图单元作为 FoodCell 类,有两个属性作为 nameprice.

In this MainViewController has custom table view cell as FoodCell class with two property as name and price.

我在 MainViewController 中实例化这个对象,当点击表格视图单元格时,这个对象传递给弹出的 DetailViewController 这不是表格视图,它只是 View 带有标签(foodName 和 foodPrice 标签)和 AddToBasket 按钮.

I instantiate this objects in MainViewController and when tap to table view cell this objects pass to popup DetailViewController which is not table view it is only View with labels(foodName and foodPrice labels) and AddToBasket button.

最后我想将这个类对象从弹出窗口DetailViewController 传递到MyCartViewController.MyCartViewController 是我展示 foodNamesfoodPrices 对象的最后场景.

And finally I want to pass this class objects from popup DetailViewController to MyCartViewController. MyCartViewController is my final scene for show the foodNames and foodPrices objects.

(例如 MainViewController 是我的食物菜单列表.DetailViewController 是我选择的食物列表.MyCartViewController 是我的购物袋.)

(e.g. MainViewController is my food menu list. DetailViewController is my selected foods list.MyCartViewController is my market bag. )

MainViewController(食物菜单列表)

import UIKit

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,
UICollectionViewDelegate, UICollectionViewDataSource,   UICollectionViewDelegateFlowLayout {

@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var mainTableView: UITableView!

var imageNames = [ImageNames]()
var searchFoods: [String]!
var priceFood: [Double]!
var searching = false


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.tabBarController?.tabBar.isHidden = false
}

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.isHidden = true
    let foodCell = Food(name: ["Hamburger big mac",
                               "Patates",
                               "Whopper",
                               "Steakhouse"], price: [15.0, 20.0, 25.0, 30.0])

    searchBar.delegate = self
    searchFoods = foodCell.name
    priceFood = foodCell.price

    imageNames = [
        ImageNames(name: "images"),
        ImageNames(name: "unnamed"),
        ImageNames(name: "unnamed")
    ]

}

func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

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

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

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return indexPath.section == 0 ? 130 : 65
}

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return indexPath.section == 0 ? 100 : 65
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MainFoodTableViewCell", for: indexPath) as! MainFoodTableViewCell

        cell.mainFoodCollectionView.delegate = self
        cell.mainFoodCollectionView.dataSource = self
        cell.mainFoodCollectionView.reloadData()
        cell.mainFoodCollectionView.tag = indexPath.row
        return cell

    } else {

        let cell = tableView.dequeueReusableCell(withIdentifier: "CellForFood", for: indexPath) as! MainFoodTitleTableViewCell

        cell.titleLabel?.text = searchFoods[indexPath.row]
        cell.priceLabel?.text = priceFood[indexPath.row].description

        return cell
    }

}

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 = [searchFoods[indexPath.row]]
            foodPriceArray = [priceFood[indexPath.row]]

            destinationViewController.detailFoodName = foodNameArray
            destinationViewController.detailFoodPrice = foodPriceArray

        }

    }
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return  imageNames.count
}

//MARK:- collection view cell size
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = UIScreen.main.bounds.width
    return CGSize(width: width, height: 130)
}

//MARK:- //collection view cell data
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MainFoodCollectionViewCell", for: indexPath) as! MainFoodCollectionViewCell
    let img = imageNames[indexPath.row]
    cell.mainFoodImage.image = UIImage(named: img.name)
    return cell
}
}

DetailViewController(选定食物列表)

import UIKit

class DetailViewController: UIViewController {

@IBOutlet weak var foodTitle: UILabel!
@IBOutlet weak var foodSubTitle: UILabel!
@IBOutlet weak var foodPiece: UILabel!
@IBOutlet weak var foodPrice: UILabel!
@IBOutlet weak var drinkPicker: UITextField!
@IBOutlet weak var menuPieceStepper: UIStepper!

var drinkPickerView = UIPickerView()

var selectDrinkType: [String] = []
var detailFoodName : [String] = []
var detailFoodPrice : [Double] = [0.0]



let foods = Food(name: ["Hamburger big mac",
                           "Patates",
                           "Whopper",
                           "Steakhouse"], price: [15.0, 20.0, 25.0, 30.0])


@IBAction func foodPieceStepper(_ sender: Any) {
}

@objc func foodPieceChangeStepper() {
    let res = menuPieceStepper.value + foods.price.first!
    foodPrice.text = "\(res)"
}

//TODO:- Add to basket
    @IBAction func addBasket(_ sender: Any) {

        let destinationVC = MyCartViewController()

        destinationVC.fromDetailFoodNames = foods.name
        destinationVC.fromDetailFoodPrices = foods.price
   }

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if(segue.identifier == "addToCartSegue") {
        if let addToCartVC = segue.destination as? MyCartViewController  {   
            addToCartVC.fromDetailFoodNames = [foodTitle.text]
            addToCartVC.fromDetailFoodPrices = foods.price
    }
   }
}

override func viewDidLoad() {
    super.viewDidLoad()

    menuPieceStepper.value = 0.0
    menuPieceStepper.minimumValue = 0.0
    menuPieceStepper.maximumValue = 30.0
    menuPieceStepper.stepValue = foods.price.first!
    menuPieceStepper.addTarget(self, action: #selector(foodPieceChangeStepper), for: .valueChanged)

    drinkPickerView.delegate = self
    drinkPicker.inputView = drinkPickerView
    selectDrinkType = ["Ayran", "Kola", "Su", "Fanta", "Şalgam", "Sprite"]

    foodTitle.text = detailFoodName.description
    foodPrice.text = detailFoodPrice.description


    self.navigationController?.navigationItem.title = "Sipariş Detayı"
    let tapGesture = UITapGestureRecognizer(target: self, action:     #selector(self.dismissKeyboard (_:)))
    self.view.addGestureRecognizer(tapGesture)
}
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
   drinkPicker.resignFirstResponder()
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.navigationBar.isHidden = false

}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.navigationBar.isHidden = true
}
}

extension DetailViewController: UIPickerViewDelegate,    UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    let selectedDrink = selectDrinkType[row]
    drinkPicker.text = selectedDrink
}

}

MyCartViewController(我的杂货袋)

import UIKit

class MyCartViewController: UIViewController, UITableViewDataSource,   UITableViewDelegate {

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

@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

    if indexPath.section == 1 && indexPath.last! <= fromDetailFoodPrices.indices.last! {

    let name = fromDetailFoodNames[indexPath.row]?.description ?? ""
    let price = fromDetailFoodPrices[indexPath.row]
    cell.myCartFoodNameLabel?.text = name
    cell.myCartFoodPriceLabel?.text = "\(String(describing: price))₺"

}
    return cell    
}
}

推荐答案

// Create Custom delegate for him

// eg:- On PopUp View Controller 
// Create protocol
protocol PopUpVCDelegate: class {

    func refresh(text: String) 
}
// declare delegate var
  weak var delegate:PopUpVCDelegate?

// puting value on it 
   self.delegate?.refresh(text: self.mDateTxtFld.text!)

// On Main ViewController (Recieving Data Class)  
extension MainViewController: PopUpVCDelegate {
    func refresh(text: String) {
        self.dateLbl.text = text

    }
}
// and don't forget to call or connect delegate when you present or push popup Vc
//like 

let resultController = self.storyboard?.instantiateViewController(withIdentifier: "PopUpVCID") as? PopUpVC       

        resultController?.delegate = self
  self.present(resultController!, animated: true, completion: nil)

// Hope Its work for you!

这篇关于如何从弹出视图控制器获取数据到自定义表格视图单元格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆