推送segue动画不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推送segue动画不起作用相关的知识,希望对你有一定的参考价值。

我正在一个用Objective编写的应用程序(只有一个类)和用Swift编写的应用程序的其余部分。在我的应用程序中我有3个故事板,这些故事板相应地有他们的viewControllers

问题:有时我使用beow代码更改rootViewController,推送segues动画在此之后停止工作。

// constant to share globally 
let kApplicationDelegate = UIApplication.shared.delegate as? AppDelegate

let controller = UIStoryboard().getControllerInstance(storyBoardName: "Autograph", identifire: "loginSuccessVC")
kApplicationDelegate?.window?.rootViewController = controller
答案

How to do Push Segue Transition Properly

我知道回答这个问题有点迟了!但总比没有好!

第一件事: 要使Push转换正常工作,您必须让UINavigationController托管您当前的ViewController作为rootViewController。这是什么意思?

例: 有两个或多个ViewControllers(此处为ViewController == VC)A,B等。如果您当前在VC A中并且想要移动到VC B,在VC A中对按钮操作执行推送(或详细信息)转换,那么请记住您的VC A必须是UINavigationController的RootViewController。

[  UI         ]                          [     ]            [     ]
[  Navigation ]-- RootViewController ==O>[  A  ]--- Push -->[  B  ] 
[  Controller ]                          [     ]            [     ]

否则它不起作用。它将显示为当前模态转换。

到目前为止,我已经认识到有两种方法可以实现这一目标。一个是纯编程的,另一个是手工使用StoryBoard和Code。

编程方式: 为了便于解释,我会在UINavigationController堆栈的开头嵌入我的UIViewController。为了达到这个目的,我们必须对AppDelegatedidFinishLaunchingWithOptions launchOptions方法进行一些小改动。它应该如下所示:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let initialVCIdentifier = "AViewController" // A ViewController **
    let firstVC = storyboard.instantiateViewController(withIdentifier: initialVCIdentifier)
    let nav = UINavigationController(rootViewController: firstVC) // Assigning the A VC as the RootViewController of the NavigationController
    window?.rootViewController = nav  // Look for the *** Note bellow
    window?.makeKeyAndVisible()

    return true
}

**您必须在InterfaceBuilder中表示一个VC的ViewController标识符。我假设你的故事板名称是Main.storyboard。 ***如果您没有为初始View控制器执行此操作,只需将此UINavigationController作为VC工作流路径中的模态VC提供

在VC A中按钮的操作中,它应如下所示:

@IBAction func TestBtnAct(_ sender: Any) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "BViewController") as UIViewController
    navigationController?.pushViewController(vc, animated: true)
}

而已!我想如果你已经尝试过,就像我上面提到的那样,它应该已经做到了。

故事板和代码携手: 这意味着您的VC A已经由故事板设计中的UINavigationController托管。在这种情况下,您无需以编程方式创建UINavigationController并将VC A嵌入为RootViewController。只需执行上述Button操作即可。

希望这对那里的人有所帮助。这是一个sample project I have done and uploaded in GitHub用于学习你所有人的目的。

干杯!

另一答案

当你改变rootViewController尝试将navigationController设置为根而不是navigationControllerrootViewController

假设你有一个viewController让它命名为VCAUINavigationController Nav1的rootViewController。然后,而不是使VCA作为rootViewControllerkApplicationDelegate?.window?。尝试制作Nav1作为rootViewControllerkApplicationDelegate?.window?

kApplicationDelegate?.window?.rootViewController = Nav1

动画不起作用,因为它可能不是正在发生的push。你推动的self.navigationControllerViewController可能是零。

以上是关于推送segue动画不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 5 中推送 segue 不起作用

具有清晰背景的 Segue 推送动画在 iOS 7 上闪烁

从 Unwind segue 触发时,Push segue 不起作用

使用xib ios7从presentviewcontroller准备推送segue

无动画推送 segue

自定义推送 segue 动画