协议中的发送数组

问题描述 投票:0回答:1

我正在尝试通过使用协议将数组从TableView发送到另一个TableView,但是当我试图在第二个TableView中显示数据时,我仅在其中获得了一个元素,而不是整个数组。

enter image description here

从模型中,我正在从name传递ExtendedIngredient数组中的HomeView以显示在TableView中的RecipesDetailsView

如上图所示,ExtendedIngredient有10个元素,但仅显示1个“通用面粉”,我想显示所有10个项目。

型号:

struct Recipes: Codable {
    let recipes: [Recipe]
}

struct Recipe: Codable {
    let title: String?
    let image: String?
    let pricePerServing: Double?
    let readyInMinutes, servings: Int?
    let instructions: String?
    let extendedIngredients: [ExtendedIngredient]
}

struct ExtendedIngredient: Codable {
    let id: Int?
    let aisle, image: String?
    let name, original, originalString, originalName: String?
    let amount: Double?
    let unit: String?
    let meta, metaInformation: [String]
}

HomeView:

protocol RecipesDetailsSelectActionDelegate: class {
    func recipeDetails(
        recipeTitle: String,
        recipeImage: String,
        recipeInstructions: String,
        ingredientsNumber: String,
        ingredientsNumbersInt: Int,
        ingredientsName: [String]
    )
}

class HomeView: UIView {

    var recipes: Recipes?
    var recipesDetails = [Recipe]()

    weak var recipeDetailsViewSelectActionDelegate: RecipesDetailsSelectActionDelegate?

    override init( frame: CGRect) {
        super.init(frame: frame)
        layoutUI()
    }

lazy var foodTableView: UITableView = {
        let foodTableView = UITableView()
        foodTableView.translatesAutoresizingMaskIntoConstraints = false
        foodTableView.backgroundColor = .customVeryLightGray()
        foodTableView.delegate = self
        foodTableView.dataSource = self
        foodTableView.register(HomeTableViewCell.self, forCellReuseIdentifier: "HomeTableViewCell")
        foodTableView.rowHeight = UITableView.automaticDimension
        foodTableView.estimatedRowHeight = 100
        foodTableView.showsVerticalScrollIndicator = false
        foodTableView.separatorStyle = .none
        return foodTableView
    }()
}

extension HomeView: UITableViewDelegate, UITableViewDataSource {

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        recipeDetailsViewSelectActionDelegate?.recipeDetails(
            recipeTitle: recipesDetails[indexPath.row].title ?? "Error",
            recipeImage: recipesDetails[indexPath.row].image ?? "Error",
            recipeInstructions: recipesDetails[indexPath.row].instructions ?? "Error",
            ingredientsNumber: "\(recipesDetails[indexPath.row].extendedIngredients.count)",
            ingredientsNumbersInt: recipesDetails[indexPath.row].extendedIngredients.count,
            ingredientsName: [(recipesDetails[indexPath.row].extendedIngredients[indexPath.row].name ?? "")]
        )
    }
}

RecipesDetailsView:

class RecipesDetailsView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        layoutUI()
    }
lazy var tableView: UITableView = {
        let tableView = UITableView()
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.delegate = self
        tableView.dataSource = self
        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = 100
        tableView.showsVerticalScrollIndicator = false
        tableView.separatorStyle = .none
        tableView.backgroundColor = .white
        tableView.register(NumberOfIngredientsTableViewCell.self, forCellReuseIdentifier: "NumberOfIngredientsTableViewCell")
        return tableView
    }()
}

extension RecipesDetailsView: UITableViewDelegate, UITableViewDataSource {

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cell = tableView.dequeueReusableCell(withIdentifier: "NumberOfIngredientsTableViewCell", for: indexPath) as! NumberOfIngredientsTableViewCell
            cell.theNameOfIngredient.text = recipeVC.ingredientsName[indexPath.row]
            return cell
        }
}

HomeViewController:

class HomeViewController: UIViewController {

    lazy var mainView: HomeView = {
        let view = HomeView(frame: self.view.frame)
        view.recipeDetailsViewSelectActionDelegate = self
        return view
    }()
}

extension HomeViewController: RecipesDetailsSelectActionDelegate {
    func recipeDetails(recipeTitle: String, recipeImage: String, recipeInstructions: String, ingredientsNumber: String, ingredientsNumbersInt: Int, ingredientsName: [String]) {
        let vc = RecipesDetailsViewController()
        vc.recipeTitle = recipeTitle
        vc.recipeImage = recipeImage
        vc.recipeInstructions = recipeInstructions
        vc.ingredientsNumber = ingredientsNumber
        vc.ingredientsNumberInt = ingredientsNumbersInt
        vc.ingredientsName = ingredientsName
        self.show(vc, sender: nil)
    }
}

RecipesDetailsViewController:

class RecipesDetailsViewController: UIViewController {

    var recipeTitle: String?
    var recipeImage: String?
    var recipeInstructions: String?
    var ingredientsNumber: String?
    var ingredientsNumberInt: Int?
    var ingredientsName: [String] = []

    lazy var mainView: RecipesDetailsView = {
        let view = RecipesDetailsView(frame: self.view.frame)
        view.backgroundColor = .white
        return view
    }()

    override func loadView() {
        super.loadView()
        mainView.recipeVC = self
        view = mainView
    }
}
ios swift uitableview swift-protocols
1个回答
1
投票
“ extendedIngredients [indexPath.row]”此表达式将始终仅返回一个对象,具体取决于所选的行。

您可能必须执行以下操作:(recipesDetails [indexPath.row] .extendedIngredients.compactMap({$ 0.name}))

© www.soinside.com 2019 - 2024. All rights reserved.