web-dev-qa-db-ja.com

iOS 8:UIAlertView / UIAlertControllerにテキストまたはボタンが表示されない

IOS 7では完全に表示されるUIAlertViewがありますが、iOS 8ではボタンやラベルが表示されません。アラートは表示されたままですが、小さな白いボックスが表示されます。 [OK]ボタンと[キャンセル]ボタンもイベントを受け取りますが、テキストは表示されません。

このアラートを使用して、ボタンのクリック時に表示しました

- (IBAction)sel_btnLogout:(id)sender {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logout!" message:@"Are you sure you want to logout?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    [alert show];
}

IOS 8でフレームをチェックしました:(0,0,0,0)を与えていますが、iOS 7では明確な値を与えています。

また、uialertviewのサブビューへの反復をチェックしました。 iOS7では、アラートのサブビューを検出するため、ループに入ります。 iOS8では、alertViewのサブビューはないという。

11
Siddhant

私は自分の問題に対する答えを得ました。問題は、プロジェクトでUIFont + Replacementカテゴリを使用していたことです。これはiOS 7では正常に機能していましたが、iOS 8では非推奨のメソッドをほとんど使用していませんでした。このため、理由はわかりませんが、アラートビューにのみラベルが表示されませんでした。

解決策:プロジェクトからカテゴリを削除し、xibを介してフォントを設定しました。プロジェクトワークスペースに任意のフォントの.tffファイルを配置すると、xibのカスタムフォントの下にそれらのフォント名が表示されます。 UIFont + Replacementカテゴリを使用する必要はありません。

4
Siddhant

クラスが利用可能かどうかを確認します

if ([UIAlertController class])
{

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert title" message:@"Alert message" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
    [alertController addAction:ok];

    [self presentViewController:alertController animated:YES completion:nil];

} 
else 
{

    UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"Alert title" message:@"Alert message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

    [alert show];

}
29
Vijay yadav

IOS 8では、メッセージの代わりにタイトルを設定できます。

[[[UIAlertView alloc] initWithTitle:@"AlertView in iOS 8." message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]show];

UIAlertViewはiOS 8から廃止されました。詳細については、こちらをご覧ください

http://nshipster.com/uialertcontroller/https://developer.Apple.com/LIBRARY/IOS/documentation/UIKit/Reference/UIAlertViewDelegate_Protocol/index.html

したがって、iOS 7とiOS 8に別々のコードを記述する場合は、代わりにUIAlertControllerを使用する必要があります。

UIAlertController *alertController = [UIAlertController  alertControllerWithTitle:@"AlertView in iOS 8"  message:nil  preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
 [self dismissViewControllerAnimated:YES completion:nil];
}]];
[self presentViewController:alertController animated:YES completion:nil];
12
Ricky

以下のコードを読んで、アラートにフィールドとボタンを追加する方法を理解してください。

- (IBAction)UIAlertControllerWithActionSheetTextFields:(id)sender {
    UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:@"Info"
                                  message:@"You are using UIAlertController with Actionsheet and text fields"
                                  preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction* ok = [UIAlertAction
                         actionWithTitle:@"OK"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             NSLog(@"Resolving UIAlert Action for tapping OK Button");
                             [alert dismissViewControllerAnimated:YES completion:nil];
                             
                         }];
    UIAlertAction* cancel = [UIAlertAction
                             actionWithTitle:@"Cancel"
                             style:UIAlertActionStyleDefault
                             handler:^(UIAlertAction * action)
                             {
                                 NSLog(@"Resolving UIAlertActionController for tapping cancel button");
                                 [alert dismissViewControllerAnimated:YES completion:nil];
                                 
                             }];
    
    [alert addAction:ok];
    [alert addAction:cancel];
    
    [alert addTextFieldWithConfigurationHandler:^(UITextField * textField) {
       textField.accessibilityIdentifier = @"usernameTextField";
        textField.placeholder = @"Enter your username";
        textField.accessibilityLabel = @"usernameLabel";
    }];
    
    [alert addTextFieldWithConfigurationHandler:^(UITextField * textField) {
       textField.placeholder = @"Enter your password";
       textField.accessibilityIdentifier = @"paswordTextField";
       textField.accessibilityLabel = @"passwordLabel";
    }];
    
    [self presentViewController:alert animated:YES completion:nil];
    
}

iOSで利用可能なアラートのタイプを完全に参照するプロジェクトが必要な場合は、以下のURLから私のプロジェクトに従ってください。

IOSのアラートバリエーション

3
DILIP KOSURI

iOS 8では、UIAletrviewUIActionSheetUIAlertcontrollerに置き換える必要があります。このドキュメントを最初に読むAppleフォーラム
Apple Alertcontroller

2
Apple Insider

そのコードを確認できます

if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending))
{
    // use UIAlertView
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:Title message:desc delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];
}
else {
    // use UIAlertController
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:Title message:desc preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

    }];
    [alert addAction:okAction];
    [self presentViewController:alert animated:YES completion:nil];
}
1
saraman