Подтвердить что ты не робот

UIAlertController, если iOS 8, в противном случае UIAlertView

Я хочу соответствовать UIAlertController, используемому в iOS 8, поскольку UIAlertView теперь устарел. Есть ли способ, которым я могу использовать это без нарушения поддержки iOS 7? Есть ли какое-то условие if, которое я могу сделать, чтобы проверить iOS 8, иначе сделайте что-нибудь еще для поддержки iOS 7?

4b9b3361

Ответ 1

Пожалуйста, см. ответ Erwan (ниже моего ответа), поскольку я вижу, что это лучший.

-

Вы можете проверить версию iOS на использование соответствующего элемента управления следующим образом:

if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
    // use UIAlertView
}
else {
    // use UIAlertController
}

Ответ 2

Я думаю, что гораздо лучший способ проверить, существует ли класс (так как iOS 4.2):

if([ClassToBeChecked class]) {

   // use it

} else {

  // use alternative

}

В вашем случае это будет:

if ([UIAlertController class]) {
   // use UIAlertController

} else {
  // use UIAlertView

}

Ответ 3

Цель C (как упоминалось выше)

if ([UIAlertController class]) {
    // use UIAlertController

} else {
    // use UIAlertView

}

Свифта

if objc_getClass("UIAlertController") == nil  {
       // use UIAlertView 

} else {
  // use UIAlertController

}

Не использовать if NSClassFromString("UIAlertController") == nil Он не работает, потому что подпись для этого метода func NSClassFromString(_ aClassName: String!) -> AnyClass!

Ответ 4

Как уже упоминалось, всегда проверяйте, существует ли функция. Я считаю, что самый безопасный подход следующий:

if (NSClassFromString(@"UIAlertController")) {
    // use UIAlertController
} else {
    // use UIAlertView
}

С очевидным риском ввода имени класса с опечаткой.:)

Из документации NClassFromString:

[Возвращает] Объект класса, названный именем aClassName, или nil, если в данный момент класс не загружается. Если aClassName равно nil, возвращает nil.

Доступность iOS (2.0 и новее)

Ответ 5

Решение для проверки версии iOS в Swift

switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
    case .OrderedAscending:
       println("iOS < 8.0")

    case .OrderedSame, .OrderedDescending:
       println("iOS >= 8.0")
}

Con этого решения: просто неправильно проверять номера версий ОС, в зависимости от того, как вы это делаете. Поэтому никогда не следует жестко привязывать кодовые зависимости, всегда проверяйте возможности, возможности или существование класса. Учти это; Apple может выпускать обратно совместимую версию класса, если они это сделали, то код, который вы предлагаете, никогда не будет использовать его, поскольку ваша логика ищет номер версии ОС и НЕ существование класса.

(Источник этой информации)

Решение для проверки существования класса в Swift

if (objc_getClass("UIAlertController") == nil) {
   // iOS 7
} else {
   // iOS 8+
}

Не используйте if (NSClassFromString("UIAlertController") == nil), потому что он корректно работает на iOS-симуляторе с использованием iOS 7.1 и 8.2, но если вы протестируете на реальном устройстве с помощью iOS 7.1, вы, к сожалению, заметите, что никогда не пройдете через оставшуюся часть фрагмент кода.

Ответ 6

// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
      //Use UIAlertController    
}
else
{
     //UIAlertView
}

Ответ 7

Создать простой utility function для уменьшения кода

КОД:

// pass minimum required iOS version
BOOL isOSSupported(NSString *minRequiredVersion)
{
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL isOSSupported = ([currSysVer compare:minRequiredVersion options:NSNumericSearch] != NSOrderedAscending) && 
                                  ![currSysVer isEqualToString:@"Unknown"];
    return isOSSupported;
}


ИСПОЛЬЗОВАНИЕ:

if(isOSSupported("8.0")
{
// Code for iOS8 and above
}
else
{
// Code for iOS7 and below
}



Или используйте системную константу NSFoundationVersionNumber_iOS_7_1, как показано ниже
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)
{
   // Code for iOS8 and above
}
else
{
   // Code for iOS7 and below
}


для дополнительных опций Ссылка

Ответ 8

Я создал очень простую оболочку в Objective-C, которая поддерживает как старый IOS UIAlertView, так и новый UIAlertViewController

https://github.com/MartinPerry/UIAlert/

Он также добавляет использование новых блоков действий в старый UIAlertView

Пример:

MyAlertMessage * a = [[MyAlertMessage alloc] initWithTitle:@"Hello" WithMessage:@"World"];

[a addButton:BUTTON_OK WithTitle:@"OK" WithAction:^(void *action) { 
  NSLog(@"Button OK at index 0 click"); 
}];

[a addButton:BUTTON_CANCEL WithTitle:@"Cancel" WithAction:^(void *action) {
  NSLog(@"Button Cancel at index 1 click"); 
}];

[a show];

Ответ 9

Я написал один класс, который обертывает UIAlertView и использует UIAlertController. Для программиста прозрачно, следовательно, достаточно импортировать эти классы в проект. Утилита этих классов - это когда в старом проекте больше изменений UIAlertView. Ссылка: https://github.com/kennymuse/UIAlertView

Ответ 10

Метод один

проверкой версии системы ios

#define iOSVersionLessThan(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
// below ios8 ,create UIAlertView
if(iOSVersionLessThan(@"7.0")){
     // todo

// ios8 and above ,UIActionController avaliable
}else{
    // todo
}

Метод два

с помощью обнаружения функции системы

// create UIActionController 
if([UIActionController class]){
    // todo
// create UIAlertView
}else{
    // todo
}

Но есть третий lib с именем PSTAlertController, который имеет обратную совместимость с iOS 7 из UIActionSheet и UIAlertView.

ref to

Ответ 11

Попробуйте ввести код ниже. Он отлично работает для iOS 8 и ниже версии.

if (IS_OS_8_OR_LATER) {
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction
                             actionWithTitle:@"OK"
                             style:UIAlertActionStyleCancel
                             handler:^(UIAlertAction *action)
                             {

                             }];
[alertVC addAction:cancelAction];

[[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{

}];
}
else{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alert show];
}