斯威夫特:你如何将信息传递给当前视图控制器下面的视图控制器?
Posted
技术标签:
【中文标题】斯威夫特:你如何将信息传递给当前视图控制器下面的视图控制器?【英文标题】:Swift: How do you pass information to a view controller underneath the current one? 【发布时间】:2017-01-19 19:48:52 【问题描述】:我有两个视图控制器,HomeViewController 和 SecondViewController,它们被推送到堆栈顶部的 HomeViewController 之上。我通过“Show”从 HomeVC 转到 SecondVC。我了解如何将信息从 SecondVC 传递到 HomeVC - 使用使用标识符的 prepare for segue 方法。但是我没有从 SecondVC 到 HomeVC 的转换,因为它嵌入在导航控制器中。从导航堆栈中弹出 SecondVC 时,如何将信息(例如字符串)从 SecondVC 传递回 HomeVC?
【问题讨论】:
如果您将参考值从 Home 传递到 Second,则不需要,它会自动完成。如果它是一个非参考值(像一个结构而不是一个类),你需要从第二个到家创建一个新的 segue 并做你第一次做的事情。 @MagoNicolasPalacios 你不需要创建一个新的 Segue 你只需覆盖“prepareForSegue”,拦截现有的 Segue 并传递值类型(你称之为“非引用”),就像一个结构SecondViewController 真棒@BrianOgden,是的,我在写我会移动吗,暂时忘记了值类型名称与引用类型。 【参考方案1】:您需要将一个ViewModel
从 HomeViewController 传递给 SecondViewController,您所做的是给您的 Segue 一个 Identifier,然后在您的 HomeViewController 中覆盖 prepareForSegue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if segue.identifier == "mySegueIdentifier"
if let destination = segue.destinationViewController as? SecondViewController
destination.aViewModel = aViewModel;
在您的 SecondViewController 中,您需要声明 ViewModel:
class SecondViewController: UIViewController
var aViewModel: AViewModel?
//rest of code
并创建一个 ViewModel,使用 struct 类型:
struct AViewModel
let AValueIWantToPassAround: String
let AnotherValueIWantToPassAround: Int
【讨论】:
谢谢,但我需要帮助才能反过来做,即从 SecondViewController 回到 HomeViewController。 @aayushi_2303 这是一个糟糕的设计决策,为什么子视图需要将信息传递回其父视图,您应该有一个 API,如果子视图控制器更改某些内容,您应该坚持它并且然后父视图控制器刷新,也就是在再次显示时检查持久性 但是快速、肮脏和长期不可维护的方法是使用@MargoNicolasPalacios 在他对您的问题的评论中提到的引用类型 @aayushi_2303 我不会告诉你怎么做,因为我会教你一个非常糟糕的软件开发习惯以上是关于斯威夫特:你如何将信息传递给当前视图控制器下面的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取当前视图HTML源并将其作为String传递给JSF ManagedBean