UIAlertViewは非推奨になったため、iOS 8で使用されているUIAlertControllerに準拠したいと思います。 iOS 7のサポートを中断せずにこれを使用できる方法はありますか? iOS 8を確認するためにできる条件がある場合、iOS 7のサポートのために何か他のことを行う場合はありますか?
Erwan(私の答えの下)の答えを見てください。
-
IOSのバージョンを確認して、次のような適切なコントロールを使用できます。
if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
// use UIAlertView
}
else {
// use UIAlertController
}
クラスが存在するかどうかを確認するより良い方法は(iOS 4.2以降)と思います:
if([ClassToBeChecked class]) {
// use it
} else {
// use alternative
}
あなたの場合、それは次のようになります:
if ([UIAlertController class]) {
// use UIAlertController
} else {
// use UIAlertView
}
目標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!
であるため機能しません。
他の人がすでに言及したように-機能が存在するかどうかを常に確認してください。最も安全なアプローチは次のとおりです。
if (NSClassFromString(@"UIAlertController")) {
// use UIAlertController
} else {
// use UIAlertView
}
タイプミスでクラス名を入力するリスクは明らかです。 :)
NClassFromStringのドキュメントから:
[戻り値] aClassNameで指定されたクラスオブジェクト、またはその名前のクラスが現在ロードされていない場合はnil。 aClassNameがnilの場合、nilを返します。
可用性iOS(2.0以降)
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を使用して実際のデバイスでテストすると、残念ながら、コードスニペット。
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];
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
//Use UIAlertController
}
else
{
//UIAlertView
}
UIAlertViewをラップし、UIAlertControllerを使用するクラスを1つ作成しました。プログラマーにとって透過的であるため、このクラスをプロジェクトにインポートするだけで十分です。このクラスのユーティリティは、古いプロジェクトで変更するUIAlertViewがさらにある場合です。リンク: https://github.com/kennymuse/UIAlertView
以下のコードを試してください。 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];
}
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
}
ただし、 PSTAlertController という名前の3番目のライブラリがあり、UIActionSheetおよびUIAlertViewのiOS 7と下位互換性があります。