I am building an iOS application(should also run on iPadOS and tvOS). We want to build without using a storyboard file and hence, UI related things would be done programmatically.
While running the application on iOS 16 simulator, I get the following exception :
IOSSceneDelegate[24955:574895] Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0x10a80bc00>.
Creation of UIWindow and assigning the rootViewController is done through code.
I want to write the code for window creation in a separate class and then invoke the same from SceneDelegate. When this is done, the said exception of 'Unbalanced calls...' comes during app launch.
My Window Creation Code:
Inside the SceneDelegate, below is done :
If the window creation code is moved inside sceneDelegate, things work smoothly.
Can you please help in what is causing this unbalanced call and how should I address this ?
While running the application on iOS 16 simulator, I get the following exception :
IOSSceneDelegate[24955:574895] Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0x10a80bc00>.
Creation of UIWindow and assigning the rootViewController is done through code.
I want to write the code for window creation in a separate class and then invoke the same from SceneDelegate. When this is done, the said exception of 'Unbalanced calls...' comes during app launch.
My Window Creation Code:
Swift:
import Foundation
import UIKit
class MyWindow: NSObject {
var window: UIWindow!
var navcontrol: UINavigationController!
func CreateWindow () {
if #available(iOS 13.0, *) {
// Guard statement checks if the following downcast is valid.
// 1) If valid, returns true and the optional (if used) is unwrapped.
// 2) If not valid, returns false exits the present function (else clause)
guard let winScene = (AppDelegate.sForegroundScene as? UIWindowScene) else {
NSLog(TAG + "Error in obtaining UIWindowScene!")
return
}
// Create window by associating it with the scene object
window = UIWindow(windowScene: winScene)
// Initialze the ViewController and set it in the UIWindow object
// This lets the UIWindow know which view controller to be used to
// display the UI.
navcontrol = UINavigationController(rootViewController: ViewController())
navcontrol.popToRootViewController(animated: false)
window?.rootViewController = navcontrol
// Displays the window. This window is set as the key window i.e displayed
// on top of all windows and receives user-input.
// The UI to be displayed is in ViewController.viewDidLoad
window?.makeKeyAndVisible()
} else {
// TODO
}
}
}
Inside the SceneDelegate, below is done :
Swift:
func scene(_ pUIScene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
NSLog(TAG + "SceneDelegate.scene(willConnectToptions)")
AppDelegate.sForegroundScene = pUIScene
let mywinobj = MyWindow()
mywinobj.CreateWindow()
}
If the window creation code is moved inside sceneDelegate, things work smoothly.
Can you please help in what is causing this unbalanced call and how should I address this ?