UIAlertView/UIAlertController iOS 7 and iOS 8 compatibility

后端 未结 14 1497
暗喜
暗喜 2020-11-28 22:31

I am using Swift to write an app and I need to show an alert. The app must be iOS 7 and iOS 8 compatible. Since UIAlertView has been replaced with UIAlert

14条回答
  •  失恋的感觉
    2020-11-28 22:55

    You could use a category to solve that (though you'll need to convert it to Swift):

    @implementation UIView( AlertCompatibility )
    
    +( void )showSimpleAlertWithTitle:( NSString * )title
                              message:( NSString * )message
                    cancelButtonTitle:( NSString * )cancelButtonTitle
    {
        if( [[UIDevice currentDevice] isSystemVersionLowerThan: @"8"] )
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle: title
                                                            message: message
                                                           delegate: nil
                                                  cancelButtonTitle: cancelButtonTitle
                                                  otherButtonTitles: nil];
            [alert show];
        }
        else
        {
            // nil titles break alert interface on iOS 8.0, so we'll be using empty strings
            UIAlertController *alert = [UIAlertController alertControllerWithTitle: title == nil ? @"": title
                                                                           message: message
                                                                    preferredStyle: UIAlertControllerStyleAlert];
    
            UIAlertAction *defaultAction = [UIAlertAction actionWithTitle: cancelButtonTitle
                                                                    style: UIAlertActionStyleDefault
                                                                  handler: nil];
    
            [alert addAction: defaultAction];
    
            UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
            [rootViewController presentViewController: alert animated: YES completion: nil];
        }
    }
    
    @end
    
    @implementation UIDevice( SystemVersion )
    
    -( BOOL )isSystemVersionLowerThan:( NSString * )versionToCompareWith
    {
        if( versionToCompareWith.length == 0 )
            return NO;
    
        NSString *deviceSystemVersion = [self systemVersion];
        NSArray *systemVersionComponents = [deviceSystemVersion componentsSeparatedByString: @"."];
    
        uint16_t deviceMajor = 0;
        uint16_t deviceMinor = 0;
        uint16_t deviceBugfix = 0;
    
        NSUInteger nDeviceComponents = systemVersionComponents.count;
        if( nDeviceComponents > 0 )
            deviceMajor = [( NSString * )systemVersionComponents[0] intValue];
        if( nDeviceComponents > 1 )
            deviceMinor = [( NSString * )systemVersionComponents[1] intValue];
        if( nDeviceComponents > 2 )
            deviceBugfix = [( NSString * )systemVersionComponents[2] intValue];
    
    
        NSArray *versionToCompareWithComponents = [versionToCompareWith componentsSeparatedByString: @"."];
    
        uint16_t versionToCompareWithMajor = 0;
        uint16_t versionToCompareWithMinor = 0;
        uint16_t versionToCompareWithBugfix = 0;
    
        NSUInteger nVersionToCompareWithComponents = versionToCompareWithComponents.count;
        if( nVersionToCompareWithComponents > 0 )
            versionToCompareWithMajor = [( NSString * )versionToCompareWithComponents[0] intValue];
        if( nVersionToCompareWithComponents > 1 )
            versionToCompareWithMinor = [( NSString * )versionToCompareWithComponents[1] intValue];
        if( nVersionToCompareWithComponents > 2 )
            versionToCompareWithBugfix = [( NSString * )versionToCompareWithComponents[2] intValue];
    
        return ( deviceMajor < versionToCompareWithMajor )
               || (( deviceMajor == versionToCompareWithMajor ) && ( deviceMinor < versionToCompareWithMinor ))
               || (( deviceMajor == versionToCompareWithMajor ) && ( deviceMinor == versionToCompareWithMinor ) && ( deviceBugfix < versionToCompareWithBugfix ));
    }
    
    @end
    

    Then just call

    [UIView showSimpleAlertWithTitle: @"Error" message: message cancelButtonTitle: @"OK"];
    

    But, if you do not want to check the system version, just use

    BOOL lowerThaniOS8 = NSClassFromString( @"UIAlertController" ) == nil;
    

    inside the category UIView( AlertCompatibility )

提交回复
热议问题