一、切换rootViewController之前,present某一控制器
self.window = UIWindow.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
self.window?.rootViewController = UINavigationController(rootViewController: ViewControllerA())
self.window?.makeKeyAndVisible()
self.present(ViewControllerB(), animated: true, completion: nil)
在切换rootViewController的时候,必须先dismiss当前控制器,否则将产生内存泄漏:
self.dismiss(animated: false) {
let window = UIApplication.shared.keyWindow
window?.rootViewController = UINavigationController(rootViewController: ViewControllerA())
window?.makeKeyAndVisible()
原因分析:因为ViewControllerA present ViewControllerB,即ViewControllerA引用ViewControllerB,自动引用计数+1。在切换rootViewController之后,window的rootViewController不再引用UINavigationController,UINavigationController的计数器为0,随后被释放,与此同时栈内的ViewControllerA也会被释放。但是,ViewControllerA始终没有release ViewControllerB,导致ViewControllerB的计数器始终不为0,从而导致内存泄漏。
二、切换rootViewController之前,push某一控制器
self.navigationController?.pushViewController(ViewControllerB(), animated: true)
在切换rootViewController的时候,直接切换即可,不用担心内存泄漏:
let window = UIApplication.shared.keyWindow
window?.rootViewController = UINavigationController(rootViewController: ViewControllerA())
window?.makeKeyAndVisible()
原因分析:因为ViewControllerA push ViewControllerB,它们均被压入到UINavigationController栈中。在切换rootViewController之后,window的rootViewController不再引用UINavigationController,UINavigationController的计数器为0,随后被释放,与此同时栈内的ViewControllerA、ViewControllerB也都会被释放。
最后,在切换window的rootViewController时候,还需要注意切换前后的window是否是同一个window,否则也会造成内存泄漏,所以建议在项目中有切换rootViewController的地方都看一下视图的层级。
一、切换rootViewController之前,present某一控制器 self.window = UIWindow.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)) self.window?.root...
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor =...
显示主页面的时候,以Tabbar作为新的RootViewController
切换RootViewController以后,页面看起来没有什么问题,查看层级关系发现原来的界面并没有释放,造成了内存泄漏
1.pushViewController
最近项目中经常会出现,不同的弹框同时出现在一个界面上的情况,所以研究了一下,如何避免此种情况的发生。
(关于UIAlertView显示的问题可参考:https://www.jianshu.com/p/7ac398ef4532)
首先,获取rootViewController的方式有两种:
//方法一:
UIWindow *windowW = [UIApplication s...
- (void)restoreRootViewController:(UIViewController *)rootViewController
typedef void (^Animation)(void);
UIWindow* window = self.window;
rootViewController.modalTransitionStyle = UIModalTrans
搭建平台测试的时候
出现这样的问题Application windows are expected to have a root view controller at the end of application launch
解决方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithO
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[AppDelegate setWindow:]: unrecognized selector sent to instance 0x6000038d03f0’
1.删除info.plist里的Main storyboard f...
在SwiftUI中隐藏状态栏,在rootViewController中可以采用以下方法:
首先,我们需要创建一个自定义的UIHostingController子类,并重写它的preferredStatusBarStyle属性,以控制状态栏的样式。这个类将作为rootViewController。
```swift
class CustomHostingController<Content: View>: UIHostingController<Content> {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // 这里可以根据需要设定状态栏的样式
然后,在SceneDelegate中,我们将创建一个CustomHostingController,并将其设置为window的rootViewController。
```swift
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// 保留原有的代码
// 使用自定义的HostingController作为rootViewController
let contentView = ContentView() // 这里替换为你自己的内容视图
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = CustomHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
// 保留原有的方法
这样,我们就成功地将自定义的CustomHostingController作为rootViewController,同时也隐藏了状态栏。
Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile
BetterThanNever:
Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile
chokshen:
Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile
weixin_43035060:
Alamofire提交json数组格式的参数
生命不止,奋斗不息:
Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile
90后的晨仔: