`

[IOS]iOS 12 UIAlertController 层级变动导致的报错

    博客分类:
  • IOS
阅读更多

参考:https://www.jianshu.com/p/e85bc5516949

 

问题所在是IOS12 UIAlertController的图层变动了.

首先看代码:

 

UIView *subView1 = alertControl.view.subviews[0];
    
    UIView *subView2 = subView1.subviews[0];
    
    UIView *subView3 = subView2.subviews[0];
    
    UIView *subView4 = subView3.subviews[0];
    
    UIView *subView5 = subView4.subviews[0];
    //IOS12 has a more uiview in subView5.subviews
    UILabel *titleView = subView5.subviews[0];
    UILabel *messageView = subView5.subviews[1];
    if ([titleView isMemberOfClass:[UIView class]]) {
        titleView = subView5.subviews[1];
        messageView = subView5.subviews[2];
    }
    
    titleView.textAlignment = NSTextAlignmentLeft;
    messageView.textAlignment = NSTextAlignmentLeft;

 

 本来这里:

UILabel *titleView = subView5.subviews[0];
UILabel *messageView = subView5.subviews[1];

 是没有问题的,但是我们在ios12打印图层发现:

2018-10-22 17:13:55.718670+0800 HKTSmartHome[1969:415473] subviews  (
    "<UIView: 0x14de7b850; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x28012bae0>>",
    "<UILabel: 0x14de8adc0; frame = (0 0; 0 0); text = 'Are you sure you want to ...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x2822529e0>>",
    "<UILabel: 0x14de7bc50; frame = (0 0; 0 0); text = 'Your Internet connection ...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x282252c10>>",
    "<UIView: 0x14de85530; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x28012bf40>>",
    "<UIView: 0x14de7bf40; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x28012bf20>>"
)

 第五层的subviews数组里面[0]是UIView而不是UILabel,发现是多了一个图层了,这就导致原来的居左布局报错了.

发现了问题,修改也很简单,就是像上面的代码,把index改成[1]就可以了,并且做一个类型判断,让IOS12以下的机型用回原来的设置.

 

补充1:类型判断:

    // 新建一个Dog对象,其中Dog是继承自Animal的
    Dog *dog = [[Dog alloc]init];
     
    // isMemberOfClass 判断是否为本类
    BOOL isDog    = [dog isMemberOfClass:[Dog class]];  // 返回YES
    // isKindOfClass   判断是否为本类或者子类
    BOOL isAnimal = [dog isKindOfClass:[Animal class]]; // 返回YES
     
    NSLog(@"%@",dog.class); // 打印dog的类名

 补充2:系统判断:

NSString *version= [UIDevice currentDevice].systemVersion;

if(version.doubleValue >=12.0) {

// 针对 12.0 以上的iOS系统进行处理

}else{

// 针对 12.0 以下的iOS系统进行处理

}

 

分享到:
评论

相关推荐

    ios-IOS 9最新的UIAlertController.zip

    在iOS开发中,UIAlertController是iOS 8及更高版本中引入的一个重要组件,用来替代了之前的UIAlertView和UIActionSheet。这个"ios-iOS 9最新的UIAlertController.zip"文件可能包含了关于如何在iOS 9中使用...

    iOS自定义UIAlertController

    在iOS开发中,UIAlertController是苹果提供的一种用于展示警告或者动作表单的系统组件,它替代了之前的UIAlertView和UIActionSheet。然而,系统的UIAlertController在默认情况下,其Title、Message和UIAlertAction的...

    ios-系统UIAlertController常用.zip

    在iOS开发中,UIAlertController是苹果提供的一种用于展示警告或者动作表单的系统控制器,它替代了之前的UIAlertView和UIActionSheet。这个“ios-系统UIAlertController常用.zip”压缩包文件包含了一个关于...

    ios-ios CZHAlertView 类似系统UIAlertController封装.zip

    [查看博客](https://blog.csdn.net/hurryupcheng) [查看github](https://github.com/jolincheng) [查看简书](https://www.jianshu.com/u/2add458bf239)

    ios demo,UIAlertController_supportedInterfaceOrientations,警告框,操作表的实例

    在iOS开发中,`UIAlertController`是用于展示警告框和操作表的重要类,它替代了之前的UIAlertView和UIActionSheet。这个demo项目显然旨在演示如何在应用程序中正确使用`UIAlertController`,并处理屏幕方向变化的...

    ios CZHAlertView 类似系统UIAlertController封装.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    iOS10系统越狱后抹机导致cydia报错修复包

    iOS10系统越狱后抹机导致cydia报错Could not open file /var/lib/dpk 包含内容: iFunBox_1.9.dmg lib.zip mobileterminal_1.0_beta1_iphoneos-arm.deb MobileTerminal.ipa README.md 包含使用说明: iOS10系统越狱...

    ios-封装Alert(UIAlertController) 自定义ActionSheet.zip

    在iOS开发中,UIAlertController是苹果提供的一种用于展示警告或者用户交互操作的系统组件。它替代了之前的UIAlertView和UIActionSheet。本教程将详细介绍如何在iOS应用中封装UIAlertController,以便自定义...

    UIAlertView\UIAlertController 文字左对齐实现

    在iOS开发中,`UIAlertView`和`UIAlertController`是两种常用的弹窗组件,用于向用户展示警告信息或者进行简单的交互。这两个组件在不同版本的iOS系统中有着不同的使用方式和表现形式。本篇将深入探讨如何实现`...

    iOS UIAlertController的强制旋转

    但是,`UIAlertController`是私有类,直接继承可能会导致审核被拒,所以这种方式并不推荐。 2. **代理方法**:可以利用`UIPopoverPresentationController`的代理方法来控制弹出视图的方向。首先,将`...

    ios-UIAlertController 的封装.zip

    在iOS开发中,UIAlertController是苹果自iOS 8起引入的一个新组件,它取代了旧的UIAlertView和UIActionSheet。这个“ios-UIAlertController 的封装.zip”文件提供了一个方便的封装,使得开发者能够更容易地在他们的...

    Xcode模拟器下载地址(iOS 8 - iOS 12)

    ### Xcode模拟器下载地址(iOS 8 - iOS 12) #### 一、Xcode模拟器概述 Xcode 是苹果公司为开发者提供的官方集成开发环境(IDE),它支持多种编程语言,包括Objective-C、Swift等,主要用于开发iOS、macOS、...

    ios-Swift UIButton 和 UIAlertController详解.zip

    在iOS开发中,Swift语言是首选的编程工具,而UIButton和UIAlertController是两个核心的UI组件,用于构建用户交互界面。这篇详细的讲解将带你深入理解这两个控件的使用方法,以及如何自定义UIAlertController的样式。...

    ios-UIAlertController.zip

    在iOS 9中,UIAlertController在功能上是和UIAlertView以及UIActionSheet相同的,UIAlertController以一种模块化替换的方式来代替这两货的功能和作用。 同创建UIAlertView相比,我们无需指定代理,也无需在初始化...

    ios-一行代码使用UIAlertController.zip

    在iOS开发中,UIAlertController是苹果提供的一种用于展示警告或者动作表单的API,它取代了之前的UIAlertView和UIActionSheet。这个"ios-一行代码使用UIAlertController.zip"资源包含了一个名为"STAlertView.swift...

    iOS12 真机调试包

    这里提到的"iOS12真机调试包"是针对iOS 12操作系统的一个关键组件,主要用于Xcode集成开发环境。 Xcode是Apple官方提供的开发工具,用于构建iOS、iPadOS、macOS、watchOS和tvOS的应用程序。在Xcode中,真机调试功能...

    ios12真机包

    这个“ios12真机包”是针对iOS 12系统进行真机调试的重要组件,确保开发者能够在真实设备上运行、测试和调试他们的应用程序。 首先,我们需要理解什么是iOS真机调试。在iOS应用开发中,开发者通常会在Xcode集成开发...

    ios-UIAlertController兼容iOS7.zip

    苹果在iOS8推出了全新的UIAlertController,旧的UIAlertView和UIActionSheet渐渐被废弃,但如果你仍然支持iOS7系统,你将不得不写两套代码。这个库解决了这个问题。 Github地址:...

Global site tag (gtag.js) - Google Analytics