首页 > 解决方案 > 在协议中发送数组

问题描述

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

在此处输入图像描述

从模型中,我传入数组 from以显示nameExtendedIngredientHomeViewTableViewRecipesDetailsView

如上图,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]
}

主页视图:

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 ?? "")]
        )
    }
}

食谱详情查看:

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

主视图控制器:

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)
    }
}

食谱详情视图控制器:

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

标签: iosswiftuitableviewswift-protocols

解决方案


问题在于以下行:成分名称:[(recipesDetails[indexPath.row].extendedIngredients[indexPath.row].name ??“”)]

"extendedIngredients[indexPath.row]" 此表达式将始终只返回一个对象,具体取决于所选行。

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


推荐阅读