关闭模态视图时如何在 UITableView 中显示数据

How to show the data in UITableView when dismissing modal view

我需要帮助。我的 Recipe 应用有一个主 viewController 和两个 UITableViewingredientTableViewdirectionTableView)。每个都由 'segue'.

从两个模态视图控制器填充

数据存储在新配方的 ingredient/direction 数组中,但 UITableView 关闭模态视图时不显示文本。

'Save' UIBarButton代码newRecipeController:

    // MARK: - IBActions
extension AddNewRecipeViewController {

    // MARK: - Add Ingredient
    @IBAction func saveIngredient(_ segue: UIStoryboardSegue)
    {
        guard let addIngredientModalViewController = segue.source as? AddIngredientModalViewController,
            let ingredient = addIngredientModalViewController.ingredient else
        {
            return
        }

        // add the new ingredient to the ingredients array
        ingredients.append(ingredient)

        // update the tableview
        let indexPath = IndexPath(row: ingredients.count - 1, section: 0)
        ingredientTableView.insertRows(at: [indexPath], with: .automatic)
    }

    @IBAction func cancelAddIngredient(_ segue: UIStoryboardSegue)
    {
        dismiss(animated: true, completion: nil)
    }

这是模态视图的 segue 代码的准备:

    // MARK: - Segue AddIngredient
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if segue.identifier == "SaveIngredient",
        let ingredientName = fieldAddNameIngredient.text,
        let ingredientValue = fieldValueOfIngredient.text
    {
        ingredient = IngredientModel(titleIngredientRecipe: ingredientName, subtitleIngredientRecipe: ingredientValue)
    }
}

我们需要确保您的转场工作正常。您需要从主 tableViewController 的 "add" 按钮按住 ctrl 并拖动到另一个视图控制器,并将其设为 "push" segue。

然后,按住 ctrl 并从 addNewRecipeViewController 上的 "save" 按钮拖动到视图控制器正上方的小退出图标。这将允许您设置一个 unwind segue(回滚到主视图控制器)。

现在你需要在 addNewRecipeViewController 中设置 prepareForSegue() 来准备发送数据,然后在主 tableViewController 中设置一个 unwind segue 函数来接收数据数据,用数据更新数组并重新加载 tableView.

首先,在addNewRecipeViewController。你有什么应该工作。重要的是你设置了视图控制器变量“ingredient”,因为它可以传回第一个视图控制器。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "SaveIngredient",
        let ingredientName = fieldAddNameIngredient.text,
        let ingredientValue = fieldValueOfIngredient.text
    {
        ingredient = IngredientModel(titleIngredientRecipe: ingredientName, subtitleIngredientRecipe: ingredientValue)
    }
}

然后,在主要 tableViewController 中,我们编写将从 unwind segue 接收数据的函数。

@IBAction func unwind(sender: UIStoryboardSegue) {
    if let sourceViewController = sender.source as? AddNewIngredientViewController, let ingredient = sourceViewController.ingredient {
        // Now ingredient holds the new data, so use it as you wish. This is an example:
        myIngredients.append(ingredient)
        tableView.reloadData()
    }
}

这样,您可以将需要的任何数据传回原始 tableViewController。我不太确定你的自定义 类 是如何设置的(成分、配方等),但只要第二个(数据输入)视图控制器有一个正确类型的变量来存储数据,它就可以在第一个(主)视图控制器中这样访问。

这里是 tutorial 关于在 unwind segue 中传递数据的。


更新:

我查看了源代码 - 问题是没有在 Storyboard identity inspector 中提供 unwind segue 标识符。 tableView 委托代码也有一些小改动(使用 === 而不是 == 检查 tableView 身份)。

下图显示了提供此标识符的位置 - 这需要与展开方法中的标识符检查相匹配。