Swift:视图控制器翻转后IBOutlets失效问题求助
Hey there! Let's break down why your IBOutlets aren't responding and fix that flip transition properly.
The Root Problem
Your current code only swaps the views of topController and VC2 using UIView.transition, but you never add VC2 to the view controller hierarchy. That means:
VC2isn't recognized by the system as an active view controller- Its lifecycle methods (like
viewDidLoad) might not fire correctly - The responder chain for your buttons/controls is broken, so taps don't register
Solution 1: Use Modal Presentation with Flip Style (Simplest Approach)
Instead of manually swapping views, leverage UIKit's built-in modal transition to handle the flip and view controller hierarchy automatically:
if var topController = UIApplication.shared.keyWindow?.rootViewController { while let presentedViewController = topController.presentedViewController { topController = presentedViewController } let VC2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "VC2") as! VC2 // Use UIKit's native flip transition VC2.modalTransitionStyle = .flipHorizontal topController.present(VC2, animated: true, completion: nil) }
This method ensures VC2 is properly added to the view controller stack, so your IBOutlets will work as expected, and the flip animation is handled natively. To flip back to VC1, just call dismiss(animated: true) from VC2.
Solution 2: Manual View Swap with Proper Controller Hierarchy
If you need more control over the transition and want to stick with UIView.transition, you must explicitly add VC2 as a child view controller to maintain the hierarchy:
if var topController = UIApplication.shared.keyWindow?.rootViewController { while let presentedViewController = topController.presentedViewController { topController = presentedViewController } let VC2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "VC2") as! VC2 // Step 1: Add VC2 as a child controller of topController topController.addChild(VC2) VC2.view.frame = topController.view.bounds topController.view.addSubview(VC2.view) VC2.didMove(toParent: topController) // Step 2: Perform the flip transition UIView.transition(from: topController.view, to: VC2.view, duration: 0.85, options: [.transitionFlipFromLeft], completion: { _ in // Clean up the old controller if you don't need it anymore topController.willMove(toParent: nil) topController.view.removeFromSuperview() topController.removeFromParent() }) }
By calling addChild, didMove(toParent:), and the corresponding cleanup methods, you tell UIKit to manage VC2 as a valid part of the view controller hierarchy—this fixes the responder chain and ensures your IBOutlets function correctly.
内容的提问来源于stack exchange,提问作者Bogdan Bogdanov

