使用 UINavigationController 返回时是不是有类似 prepareForSegue 的东西?

Posted

技术标签:

【中文标题】使用 UINavigationController 返回时是不是有类似 prepareForSegue 的东西?【英文标题】:Is there something like prepareForSegue when going back with UINavigationController?使用 UINavigationController 返回时是否有类似 prepareForSegue 的东西? 【发布时间】:2015-12-14 18:27:34 【问题描述】:

我的ViewOne 中有一个数组,我使用prepareForSegue 函数将其传递给ViewTwo

当我删除 ViewTwo 中的数组数据并使用 NavigationController 上的后退按钮返回或向右滑动时,ViewOne 中的数组仍然有所有数据并且不知道我删除了一些东西其中。

这个问题有解决办法吗?

ViewOne:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if(segue.identifier == "submitSegue") 
            let shoppingCart = segue.destinationViewController as! ShoppinCartScreen;
            if(artikel != nil) 
                shoppingCart.alleArtikel = alleArtikel
                print("Test: \(artikel?.artikelnummer)")
            
        
    

视图二:

var alleArtikel = [Artikel]()

    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return alleArtikel.count
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("ShoppingCartScreenCell", forIndexPath: indexPath) as!ShoppingCartScreenCell
        let eintrag = alleArtikel[indexPath.row]
        cell.previewImage.image = eintrag.foto
        cell.artikelNummer.text = eintrag.artikelnummer
        return cell
    

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) 
        if(editingStyle == .Delete) 
            alleArtikel.removeAtIndex(indexPath.row)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        
    

我有一个主视图 (ViewOne) 和一个 TableView(ViewTwo)。

【问题讨论】:

首先你真的需要展示一些代码。你在使用表格视图吗?您如何将数据保存在 ViewTwo 的数组中?如果您使用的是 tableview,您是否正在执行 tableview 刷新? 如果 ViewOne 是一个 tableview - 你应该刷新它或者你可以阅读 Unwind segues。 我已经添加了一些代码,希望它可以帮助你帮助我。在我的 ViewTwo 中,我使用的是 TableView。不,我没有执行 tableview 刷新。 不太确定你想做什么,但看看我不久前发布的this answer,它可能会让你开始。 【参考方案1】:

在 Swift 中,数组是值类型而不是引用类型(请参阅 Apple Developer Blog entry),因此当您将其“传递”给 view2 时,您实际上只是在制作副本。 View2 修改副本,但原始保持不变。

【讨论】:

swift中有引用类型的数组吗? @user3653164 对象是引用类型 - 因此您可以将数据封装在一个类中,并传递对它的引用 - 但还有其他方法,这取决于您希望实现的目标。 @user3653164 一般来说,我尽量避免将数据存储在视图控制器中。将数据存储在其他对象中,并根据需要在视图控制器之间传递对这些对象的引用。 你能给我一个例子吗?我在想一个里面只有一个数组的小类,但是可以在两个 ViewController 中访问这个类的对象吗? @user3653164 是的,简单来说,您可以在 view1 中创建此类的对象,然后将其引用传递给 view2。但是,如果这注定不是一个简单的应用程序,您可能需要退后一步,考虑如何组织所有数据和视图以协同工作。你知道这种东西的模型-视图-控制器设计模式吗 - MVC【参考方案2】:

返回时不要使用prepareForSegue 方法,据我所知这是不可能的,只需运行viewWillDisappear 函数即可。基本上这是视图消失时的viewDidLoad 函数。它会在您离开视图时执行 segue 时运行。

示例:

override func viewWillDisappear(animated: Bool)

    super.viewWillDisappear(animated)
    print("the view is hidden")

【讨论】:

但是当我在 ViewTwo 中使用 viewWillDisappear 时,如何更改 ViewOne 中的数组?在我从 ViewTwo 回到 ViewOne 之后,我想做类似 ViewOne.array = ViewTwo.array 的东西。

以上是关于使用 UINavigationController 返回时是不是有类似 prepareForSegue 的东西?的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationcontroller 中未使用的视图会发生啥?

使用 push segue 时 UINavigationController 是不是强制

UINavigationController - 使用 UIBlurEffect 清除背景

一起使用 UITabBarController 和 UINavigationController

iPhone - UINavigationController - 使用 CATransaction 自定义动画

如何在 SwiftUI 中使用 UINavigationController