web-dev-qa-db-ja.com

iOS 8の場合はUIAlertController、それ以外の場合はUIAlertView

UIAlertViewは非推奨になったため、iOS 8で使用されているUIAlertControllerに準拠したいと思います。 iOS 7のサポートを中断せずにこれを使用できる方法はありますか? iOS 8を確認するためにできる条件がある場合、iOS 7のサポートのために何か他のことを行う場合はありますか?

27
Triton Man

Erwan(私の答えの下)の答えを見てください。

-

IOSのバージョンを確認して、次のような適切なコントロールを使用できます。

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

クラスが存在するかどうかを確認するより良い方法は(iOS 4.2以降)と思います:

if([ClassToBeChecked class]) {

   // use it

} else {

  // use alternative

}

あなたの場合、それは次のようになります:

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

} else {
  // use UIAlertView

}
99
Erwan

目標C(上記のとおり)

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

} else {
    // use UIAlertView

}
_

Swift

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

} else {
  // use UIAlertController

}
_

if NSClassFromString("UIAlertController") == nilは使用しないでください。このメソッドのシグネチャはfunc NSClassFromString(_ aClassName: String!) -> AnyClass!であるため機能しません。

12
goce

他の人がすでに言及したように-機能が存在するかどうかを常に確認してください。最も安全なアプローチは次のとおりです。

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

タイプミスでクラス名を入力するリスクは明らかです。 :)

NClassFromStringのドキュメントから:

[戻り値] aClassNameで指定されたクラスオブジェクト、またはその名前のクラスが現在ロードされていない場合はnil。 aClassNameがnilの場合、nilを返します。

可用性iOS(2.0以降)

3
xius

SwiftでiOSバージョンを確認するための解決策

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

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

この解決策の短所:どちらの方法でも、OSのバージョン番号をチェックするのは単に悪い習慣です。このように依存関係をハードコーディングすることは絶対にしないでください。機能、機能、またはクラスの存在を常に確認してください。このことを考慮; Appleは、クラスの後方互換バージョンをリリースする場合があります。リリースした場合、ロジックはクラスの存在ではなくOSバージョン番号を検索するため、推奨コードは使用しません。

この情報のソース

Swiftでクラスの存在を確認するための解決策

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

if (NSClassFromString("UIAlertController") == nil)を使用しないでください。iOS7.1および8.2を使用するiOSシミュレーターで正常に動作しますが、iOS 7.1を使用して実際のデバイスでテストすると、残念ながら、コードスニペット。

2
King-Wizard

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];
1
Martin Perry
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
      //Use UIAlertController    
}
else
{
     //UIAlertView
}
1
Sabareesh

UIAlertViewをラップし、UIAlertControllerを使用するクラスを1つ作成しました。プログラマーにとって透過的であるため、このクラスをプロジェクトにインポートするだけで十分です。このクラスのユーティリティは、古いプロジェクトで変更するUIAlertViewがさらにある場合です。リンク: https://github.com/kennymuse/UIAlertView

1
kennymuse

以下のコードを試してください。 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];
}
0
amitshinik

方法1

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
}

方法2

システム機能検出

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

ただし、 PSTAlertController という名前の3番目のライブラリがあり、UIActionSheetおよびUIAlertViewのiOS 7と下位互換性があります。

参照

0
monjer