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