UIAlertView は非推奨になったため、iOS 8 で使用されている UIAlertController に準拠したいと考えています。iOS 7 のサポートを中断せずにこれを使用できる方法はありますか? iOS 8をチェックするためにできるif条件はありますか?それ以外の場合は、iOS 7のサポートのために何か他のことをしますか?
11 に答える
目標 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!
Erwanの回答(私の回答の下) を参照してください。
--
iOS のバージョンを確認して、次のように適切なコントロールを使用できます。
if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) {
// use UIAlertView
}
else {
// use UIAlertController
}
他の人がすでに述べたように、機能が存在するかどうかを常に確認してください。最も安全なアプローチは次のとおりだと思います。
if (NSClassFromString(@"UIAlertController")) {
// use UIAlertController
} else {
// use UIAlertView
}
タイプミスでクラス名を入力する明らかなリスクがあります。:)
NClassFromStringのドキュメントから:
[戻り値] aClassName で指定されたクラス オブジェクト、またはその名前のクラスが現在ロードされていない場合は nil。aClassName が nil の場合、nil を返します。
可用性 iOS (2.0 以降)
シンプルな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
}
その他のオプションリンク
古い 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];
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
//Use UIAlertController
}
else
{
//UIAlertView
}
方法 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 つ目のライブラリがあります。
を参照
以下のコードを試してください。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];
}