使用 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