斯威夫特:你如何将信息传递给当前视图控制器下面的视图控制器?

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 我不会告诉你怎么做,因为我会教你一个非常糟糕的软件开发习惯

以上是关于斯威夫特:你如何将信息传递给当前视图控制器下面的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

关闭时将值传递给视图控制器时出错 |斯威夫特 5

如何将标签内的标签快速传递给另一个视图控制器[关闭]

如何获取当前视图HTML源并将其作为String传递给JSF ManagedBean

Swift:如何将信息传递给弹出视图?

如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件

ASP.NET MVC 视图需要将选定的下拉列表和日历日期传递给模型