繁体   English   中英

如何在解除模态视图时在UITableView中显示数据

[英]How to show the data in UITableView when dismissing modal view

我需要帮助。 我的Recipe应用程序有一个主viewController,有两个UITableViewingredientTableViewdirectionTableView )。 每个都是通过'segue'从两个模态视图控制器填充。

数据存储在新配方的成分/方向数组中,但UITableView在解除模态视图时不显示文本。

这是UIStoryboard图像

“保存” 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)
    }
}

我们需要确保您的segues正常工作。 你需要从主tableViewController的“添加”按钮ctrl +拖动到另一个视图控制器,并使其成为“推”segue。

然后,按住Ctrl +从addNewRecipeViewController上的“save”按钮addNewRecipeViewController到视图控制器正上方的小出口图标。 这将允许您设置展开segue(回滚到主视图控制器)。

现在你需要在addNewRecipeViewController设置prepareForSegue() ,它准备好发送回数据,然后在主tableViewController设置一个展开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 我不太确定你的自定义类是如何设置的(成分,配方等),但只要第二个(数据输入)视图控制器有一个正确类型的变量来存储数据,就可以像这样访问它第一个(主)视图控制器。

这是一个关于在展开segue中传递数据的教程


更新:

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

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

在Storyboard中放松场景底部的segue

放松segues的标识符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM