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

Posted

技术标签:

【中文标题】关闭模式视图时如何在 UITableView 中显示数据【英文标题】:How to show the data in UITableView when dismissing modal view 【发布时间】:2018-06-03 09:51:22 【问题描述】:

我需要帮助。我的食谱应用程序有一个主视图控制器,其中有两个 UITableViewingredientTableViewdirectionTableView)。每个都由“segue”从两个模态视图控制器填充。

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

newRecipeController 的“保存”UIBarButton 代码:

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

【问题讨论】:

您的 saveIngredient() 函数将 segue 作为参数(它不应该这样做,因为它是一个按钮),但您从不使用 segue 调用它,所以 segue.source 可能是 nil由于guard 语句,数据永远不会添加到表视图中。此外,您似乎没有提到主要的tableView。如果您关闭模态视图而不使用 segue,则不会调用 prepareForSegue()。您可能需要从模态视图中找到主要的tableView,使用self.presentingViewController() 之类的内容,然后将其附加到表格中。 另外,您是否将所有成分存储在主表视图控制器的数组中? @Chris 感谢您的关注。成分以数组形式存储到主数组“NewRecipe”中。当我保存 newRecipe 时,detailController 会加载所有成分。 @Chris,我试着听从你的建议......但我是 Swift 的新手,我还有更多东西要学习...... 查看您的故事板,您可能只需要展开转场将数据发送回主视图控制器,然后使用prepareForSegue()。我现在不在电脑前,但我稍后会看看这个。 【参考方案1】:

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

然后,ctrl+从addNewRecipeViewController 上的“保存”按钮拖动到视图控制器正上方的小退出图标。这将允许您设置展开转场(回滚到主视图控制器)。

现在您需要在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 中,我们编写将从展开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 在展开转场中传递数据。


更新:

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

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

【讨论】:

谢谢克里斯。我已尝试用您的示例进行修改...什么也没有,不起作用。在 detailController 中,成分已加载但未在 newRecipeController 中...我将使用另一种解决方案再试一次。 正确后错误消失:'ingredients.append(senderIngredientVC.ingredient)'。没有 senderIngredientVC 就会出现上面的错误... 如果您愿意,我很乐意查看 XCode 项目文件? 谢谢,我去看看 @Davide - 我已经修好了!我将通过 DropBox 分享该项目 - 我已添加 cmets 并将更新我的答案。

以上是关于关闭模式视图时如何在 UITableView 中显示数据的主要内容,如果未能解决你的问题,请参考以下文章

MFC如何在切换视图时关闭无模式对话框

从全屏模式关闭 MPMoviewPlayer 后 UITableView 下的空(白)行

如何在 GDAL ruby​​ 绑定中显式关闭数据集?

如何在编辑模式下在 UITableView 中添加额外的单元格?

在Swift ios中方向更改为横向模式时隐藏底部表格视图

UITableView 通过按下按钮对内容进行排序[关闭]