关闭模式视图时如何在 UITableView 中显示数据
Posted
技术标签:
【中文标题】关闭模式视图时如何在 UITableView 中显示数据【英文标题】:How to show the data in UITableView when dismissing modal view 【发布时间】:2018-06-03 09:51:22 【问题描述】:我需要帮助。我的食谱应用程序有一个主视图控制器,其中有两个 UITableView
(ingredientTableView
和 directionTableView
)。每个都由“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 中显示数据的主要内容,如果未能解决你的问题,请参考以下文章
从全屏模式关闭 MPMoviewPlayer 后 UITableView 下的空(白)行