从目标视图控制器推送新的视图控制器 (swift)
Push new View Controller from destination View Controller (swift)
我正在尝试获取目标视图控制器以推送新的视图控制器,但我似乎无法以编程方式或通过情节提要片段获取它。
这是我正在尝试做的事情:
我有 3 个视图控制器(我们称它们为 A、B 和 C)。这三个都是在故事板中创建(设计?)的。我从视图控制器 A 开始,当用户按下一个按钮时,我想以模态方式呈现视图控制器 B,然后当用户在视图控制器 B 中选择一个单元格时,我希望视图控制器 B 被关闭(模态),并且我希望视图控制器 A 推送一个新的视图控制器(视图控制器 C)。
到目前为止,我尝试实现的方法是当用户按下视图控制器 A 中的按钮时,我以编程方式模态推送视图控制器 B,然后当用户在视图控制器 B 中选择一个单元格时,我继续回到视图控制器 A,并尝试从视图控制器 B 的 prepareForSegue 函数中推送视图控制器 C,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let viewA = segue.destinationViewController as? ViewControllerA {
let cell = sender as! ViewControllerBTableViewCell
var viewC = storyboard?.instantiateViewControllerWithIdentifier("viewControllerC") as! ViewControllerC
viewC.IDToDisplay = cell.userID
viewA.navigationController?.pushViewController(viewC, animated: true)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
但是,当我 运行 这个...视图控制器 C 永远不会被推送!
我需要从视图控制器 A 推送视图控制器 C 的原因是我需要用户能够使用 "back" 按钮从视图控制器 C 导航回视图控制器 A...不是从视图控制器 C 返回到视图控制器 B。
本质上,我尝试创建的流程是视图 A -> 模态视图 B -> 视图 C ---> 返回视图 A,就好像视图 B 消失了一样(因为它应该消失)。 请注意,但是,在视图 A 推送到视图 C 之前,视图 B 确实需要能够设置视图 C 的 IDToDisplay
值。
有没有一种干净的(标准的)方法来实现这个?或者我将不得不变得笨拙?
用户是否按下了 viewController C 中的按钮?
如果是这样,你可以使用这个:
self.navigationController?.popToRootViewControllerAnimated(true)
只需将它添加到您在 viewController C 中按下按钮的位置,它应该会返回到 A
您可以通过两种方式解决这个问题
第一个选项:您可以在 B 控制器中创建一个 clousure var 并在关闭 B 控制器之前执行它
例如:在BController中
class BTableViewController: UITableViewController {
var pushClosure:(()->())?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
pushClosure?()
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
然后在 prepareForSegue 的控制器中做类似的事情
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SegueID" {
let nextView:BController = segue.destinationViewController as! BController
nextView.pushClosure = {
self.performSegueWithIdentifier("SegueID To C Controller", sender:nil)
}
}
}
第二个选项是实现你自己的委托
在 BController
protocol ClassNameDelegate{
func pushToC()
}
class ClassName: NSObject {
var delegate:ClassNameDelegate?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.delegate.pushToC()
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
并且在 A 控制器中
class AViewController:ClassNameDelegate{
func pushToC(){
self.performSegueWithIdentifier("SegueID To C Controller", sender:nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SegueID" {
let bController:BController = segue.destinationController as! BController
bController.setDelegate = self
}
}
}
希望对你有所帮助
我正在尝试获取目标视图控制器以推送新的视图控制器,但我似乎无法以编程方式或通过情节提要片段获取它。
这是我正在尝试做的事情:
我有 3 个视图控制器(我们称它们为 A、B 和 C)。这三个都是在故事板中创建(设计?)的。我从视图控制器 A 开始,当用户按下一个按钮时,我想以模态方式呈现视图控制器 B,然后当用户在视图控制器 B 中选择一个单元格时,我希望视图控制器 B 被关闭(模态),并且我希望视图控制器 A 推送一个新的视图控制器(视图控制器 C)。
到目前为止,我尝试实现的方法是当用户按下视图控制器 A 中的按钮时,我以编程方式模态推送视图控制器 B,然后当用户在视图控制器 B 中选择一个单元格时,我继续回到视图控制器 A,并尝试从视图控制器 B 的 prepareForSegue 函数中推送视图控制器 C,如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let viewA = segue.destinationViewController as? ViewControllerA {
let cell = sender as! ViewControllerBTableViewCell
var viewC = storyboard?.instantiateViewControllerWithIdentifier("viewControllerC") as! ViewControllerC
viewC.IDToDisplay = cell.userID
viewA.navigationController?.pushViewController(viewC, animated: true)
self.dismissViewControllerAnimated(true, completion: nil)
}
}
但是,当我 运行 这个...视图控制器 C 永远不会被推送!
我需要从视图控制器 A 推送视图控制器 C 的原因是我需要用户能够使用 "back" 按钮从视图控制器 C 导航回视图控制器 A...不是从视图控制器 C 返回到视图控制器 B。
本质上,我尝试创建的流程是视图 A -> 模态视图 B -> 视图 C ---> 返回视图 A,就好像视图 B 消失了一样(因为它应该消失)。 请注意,但是,在视图 A 推送到视图 C 之前,视图 B 确实需要能够设置视图 C 的 IDToDisplay
值。
有没有一种干净的(标准的)方法来实现这个?或者我将不得不变得笨拙?
用户是否按下了 viewController C 中的按钮? 如果是这样,你可以使用这个:
self.navigationController?.popToRootViewControllerAnimated(true)
只需将它添加到您在 viewController C 中按下按钮的位置,它应该会返回到 A
您可以通过两种方式解决这个问题
第一个选项:您可以在 B 控制器中创建一个 clousure var 并在关闭 B 控制器之前执行它
例如:在BController中
class BTableViewController: UITableViewController {
var pushClosure:(()->())?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
pushClosure?()
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
然后在 prepareForSegue 的控制器中做类似的事情
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SegueID" {
let nextView:BController = segue.destinationViewController as! BController
nextView.pushClosure = {
self.performSegueWithIdentifier("SegueID To C Controller", sender:nil)
}
}
}
第二个选项是实现你自己的委托 在 BController
protocol ClassNameDelegate{
func pushToC()
}
class ClassName: NSObject {
var delegate:ClassNameDelegate?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.delegate.pushToC()
self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
}
并且在 A 控制器中
class AViewController:ClassNameDelegate{
func pushToC(){
self.performSegueWithIdentifier("SegueID To C Controller", sender:nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SegueID" {
let bController:BController = segue.destinationController as! BController
bController.setDelegate = self
}
}
}
希望对你有所帮助