27

UIAlertView は非推奨になったため、iOS 8 で使用されている UIAlertController に準拠したいと考えています。iOS 7 のサポートを中断せずにこれを使用できる方法はありますか? iOS 8をチェックするためにできるif条件はありますか?それ以外の場合は、iOS 7のサポートのために何か他のことをしますか?

4

11 に答える 11

12

目標 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!

于 2015-01-19T14:02:20.920 に答える
4

Erwanの回答(私の回答の下) を参照してください。

--

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

if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
    // use UIAlertView
}
else {
    // use UIAlertController
}
于 2014-06-30T08:51:26.090 に答える
3

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

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

タイプミスでクラス名を入力する明らかなリスクがあります。:)

NClassFromStringのドキュメントから:

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

可用性 iOS (2.0 以降)

于 2014-10-23T11:45:10.130 に答える
1

シンプルな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
}


その他のオプションリンク

于 2014-08-26T08:50:11.833 に答える
1

古い iOS UIAlertView と新しいものの両方をサポートする、Objective-C で非常に単純なラッパーを作成しました。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];
于 2014-12-15T10:22:56.087 に答える
1
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
      //Use UIAlertController    
}
else
{
     //UIAlertView
}
于 2014-07-24T14:21:12.950 に答える
0

方法 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
}

しかし、UIActionSheet と UIAlertView の iOS 7 との下位互換性を処理するPSTAlertControllerという名前の 3 つ目のライブラリがあります。

を参照

于 2014-12-05T07:55:47.043 に答える
0

以下のコードを試してください。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];
}
于 2016-06-24T06:32:14.167 に答える