在同一个按钮中多次展开 - Swift
Multiple unwind in the same button - Swift
我想知道是否可以在同一个按钮上分配两种不同的展开方法。例如:
我有这个视图导航:
- 首页->A->B
- 首页->C->B
A 和 C 视图导航到 B,但我想 return 使用相同的 B 视图和控制器转到以前的视图。
有可能吗?
我一直在考虑根据出现的视图以编程方式为按钮编写分配展开方法。
提前致谢
抱歉我的英语不好。
虽然,问题不是很清楚。但我能理解的是,您想导航回之前的视图,即 B>C 或 B>A,具体取决于用户来自何处。
如果是,则检查 UINavigationController。它跟踪导航历史并自动添加后退按钮。有点像我们浏览器中的后退按钮。
这里有一个教程,虽然有点旧:Link
这是一个对我很有效的 Swift 解决方案。下面的代码只有在你在故事板和代码中正确连接你的 segues 时才有效。查看此 page 以获得有关设置展开转场的详细解释。
总结:
您正在从多个其他视图访问同一视图。因此,当您转到一个视图时,您可以将源视图控制器(您当前所在的视图)传递给您将要访问的视图中的 属性。
在您认为您将放松的情况下,您可以检查 属性 保存您来自哪里的信息(class),然后执行segue 基于它是什么视图。
代码:(使用示例:主页 -> A -> B 或...主页 -> C -> B)
注意:B 是将展开到多个不同视图的视图。
在 A 或 C 中:(代码在两个视图中的工作方式相同)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "segueIdentifierInViewAthatGoesToViewB" {
let controller:B = segue.destinationViewController as! B
//the code below passes our current view controller class to a property in view B.
//So, view B will know what view we came from.
//In our example, we're coming from view A or C
controller.viewControllerNavigatedFrom = segue.sourceViewController
}
}
在 B 中:
//设置一个 IBAction,它将检查源视图控制器(我们在转至此视图时传递的)并根据我们来自的位置执行转场。你可以把它连接到一个按钮或任何你真正想要的东西上。
//isKindOfClass(A) - "A" 将是您的 class
的名称
//setup a property to receive the view controller class where we are coming from
var viewControllerNavigatedFrom:AnyObject?
@IBAction func myButtonPressed(sender: AnyObject) {
if self.viewControllerNavigatedFrom!.isKindOfClass(A) {
//Unwind to view A
performSegueWithIdentifier("unwindFromBbackToA", sender: sender)
}
else if self.viewControllerNavigatedFrom!.isKindOfClass(C) {
//Unwind to view C
performSegueWithIdentifier("unwindFromBbackToC", sender: sender)
}
}
我想知道是否可以在同一个按钮上分配两种不同的展开方法。例如:
我有这个视图导航:
- 首页->A->B
- 首页->C->B
A 和 C 视图导航到 B,但我想 return 使用相同的 B 视图和控制器转到以前的视图。
有可能吗?
我一直在考虑根据出现的视图以编程方式为按钮编写分配展开方法。
提前致谢
抱歉我的英语不好。
虽然,问题不是很清楚。但我能理解的是,您想导航回之前的视图,即 B>C 或 B>A,具体取决于用户来自何处。
如果是,则检查 UINavigationController。它跟踪导航历史并自动添加后退按钮。有点像我们浏览器中的后退按钮。
这里有一个教程,虽然有点旧:Link
这是一个对我很有效的 Swift 解决方案。下面的代码只有在你在故事板和代码中正确连接你的 segues 时才有效。查看此 page 以获得有关设置展开转场的详细解释。
总结:
您正在从多个其他视图访问同一视图。因此,当您转到一个视图时,您可以将源视图控制器(您当前所在的视图)传递给您将要访问的视图中的 属性。
在您认为您将放松的情况下,您可以检查 属性 保存您来自哪里的信息(class),然后执行segue 基于它是什么视图。
代码:(使用示例:主页 -> A -> B 或...主页 -> C -> B)
注意:B 是将展开到多个不同视图的视图。
在 A 或 C 中:(代码在两个视图中的工作方式相同)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "segueIdentifierInViewAthatGoesToViewB" {
let controller:B = segue.destinationViewController as! B
//the code below passes our current view controller class to a property in view B.
//So, view B will know what view we came from.
//In our example, we're coming from view A or C
controller.viewControllerNavigatedFrom = segue.sourceViewController
}
}
在 B 中:
//设置一个 IBAction,它将检查源视图控制器(我们在转至此视图时传递的)并根据我们来自的位置执行转场。你可以把它连接到一个按钮或任何你真正想要的东西上。
//isKindOfClass(A) - "A" 将是您的 class
的名称//setup a property to receive the view controller class where we are coming from
var viewControllerNavigatedFrom:AnyObject?
@IBAction func myButtonPressed(sender: AnyObject) {
if self.viewControllerNavigatedFrom!.isKindOfClass(A) {
//Unwind to view A
performSegueWithIdentifier("unwindFromBbackToA", sender: sender)
}
else if self.viewControllerNavigatedFrom!.isKindOfClass(C) {
//Unwind to view C
performSegueWithIdentifier("unwindFromBbackToC", sender: sender)
}
}