UIAlertView的风险

本篇文章我将会从两个方面来讲UIAlertView的风险-传统的keyWindow的问题和一些系统上适配上问题.

keyWindow的问题

下面从不用UIScene管理window的情况谈起.

对于UIApplication中的keyWindow的定义,如下所示

This property holds the UIWindow object in the windows array that is most recently sent the makeKeyAndVisible message.

也就是说,只要调用了UIWindowmakeKeyAndVisible方法,这个UIWindow实例就会成为keyWindow,当然啦,keyWindow有且仅有一个,比如A window是keyWindow,当B window调用了makeKeyAndVisible方法,B window会成为keyWindow.A就不是keyWindow了.

如果我们喜欢在[UIApplication sharedApplication].keyWindow的方式来自定义弹窗可能就会出现问题.

iOS 13的适配问题

如果你们的iOS 13项目不是旧有工程升级上来的,而是新创建的工程,就有可能会出现使用UIAlertView的问题.具体点说是,当UIScene管理Window的情况下无法使用UIAlertView.

在这里插入图片描述

对于不支持UIScene的应用来说,获取window直接用下面的方法获取keyWindow即可.

UIWindow *window = [UIApplication sharedApplication].delegate.window;
UIWindow *window = [UIApplication sharedApplication].windows.firstObject;

对于支持UIScene,但是不支持多UIScene(多场景)的,则使用下面的方法.

UIWindow *window = ((id<UIWindowSceneDelegate>)[UIApplication sharedApplication].connectedScenes.anyObject.delegate).window;

下面是支持多场景的蛋疼时刻了…

但是,对于支持多场景的情况下来说,我们没办法在不借助window上已经add的UIView实例,或者那个Window来直接找出当前场景下活跃的Window.

NSDictionary *sceneDic = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UIApplicationSceneManifest"];
if (sceneDIc) {/// 判断是否支持UIScene
	if ([UIApplication sharedApplication].supportsMultipleScenes) {//支持多场景
		/// 获取所有已链接的Scenes
		NSSet <UIScene *> *connectedScenes = [UIApplication sharedApplication].connectedScenes;
		for (UIScene *scene in (UIWindowScene *)connectedScenes.allObjects) {
			UISceneActivationState activationState = scene.activationState;
		}
	}
}

activationState可以通过判断是否是前台活跃的UISceneActivationStateForegroundActive.不过前台活跃的UIScene可能有多个.emmmmm,如果支持场景.我感觉对一些,例如window上的progressHUD显示是一个灾难.不过解决方案还是有的,那就是改用iOS 8开始支持的UIPresentationController.如果最近有时间的话,我准备抽时间写一个和这个有关的博文.

发布了269 篇原创文章 · 获赞 59 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/104041447