Проблема пользовательского интерфейса с нулевым названием в UIAlertView iOS 8 beta 5

У меня есть проблема, связанная с UIAlertView при запуске нашего приложения на iOS 8. Я показываю предупреждение с заголовком nil. В iOS 7 все работало нормально, но теперь интерфейс выглядит странно.

Я прикрепил скриншот здесь.

Одно решение, которое я нашел, состоит в том, что когда я предоставляю пустую строку @ "", все выглядит хорошо. Смотрите скриншот ниже. Но я не уверен, что проблема, о которой я упоминал, связана с ошибкой в ​​бета-версии iOS 8 или есть какое-либо иное лучшее решение. Даже с решением это не точно, как это было в iOS 7.

iOS 7 - отображение вида оповещения с заголовком nil. Скриншот здесь.

4 ответа

Решение

Это была лучшая практика для меня, чтобы использовать initWithTitle:@"" за UIAlertView, UIActionSheet начиная с iOS 6, потому что я столкнулся с проблемой дизайна в то время, когда я использовал initWithTitle:nil, Я пытался найти обратно, я не мог найти, в чем именно причина.

С вашего скриншота на iOS 8, я думаю, что изменение представления иерархии на UIAlertView для iOS 8. Я думаю, Auto layout может быть реализовано в иерархии представлений, а также вы можете увидеть, что messageLabel перепрыгивает на titleLabel.

Я не могу быть уверен, потому что иерархия представления для UIAlertView является частной.

Класс UIAlertView предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представления для этого класса является закрытой и не должна быть изменена.

См.: https://developer.apple.com/library/ios/documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html

Но я использую код:-

NSLog(@"%@",[self.alertView description]);

Результат на iOS 7.1:

<UIAlertView: 0x7fb3c05535b0; frame = (18 263; 284 62); opaque = NO; layer = <CALayer: 0x7fb3c0519810>>

Результат на iOS 8.0:

<UIAlertView: 0x7bf64840; frame = (0 0; 0 0); layer = <CALayer: 0x7bf648f0>>

Я не уверен, почему фрейм UIAlertView для iOS 8 (0 0; 0 0);

Как сказал Майк, я думаю, вы должны научиться использовать UIAlertController для iOS 8.

Самое близкое, что я мог получить с iOS 8, установив заголовок вместо сообщения:

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location field required." message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

UIAlertView набор заголовков iOS8

Следует отметить, однако, что UIAlertView не рекомендуется в iOS 8, и, если вы собираетесь использовать отдельные пути кода для iOS 7 и iOS 8, вы должны использовать UIAlertController вместо:

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Location field required."  message:nil preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    [self dismissViewControllerAnimated:YES completion:nil];
}]];

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

Я получил одинаковые результаты с обоими методами.

Мне удалось добиться приличного выравнивания сообщений без жирного шрифта:

  1. Установка заголовка на @"" вместо nil, и
  2. (Если IOS8) добавьте "\n" перед сообщением.
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" 
                                    message:@"\nLocation field required." 
                                    delegate:nil 
                                    cancelButtonTitle:@"OK" 
                                    otherButtonTitles:nil];

введите описание изображения здесь

Пожалуйста, попробуйте этот код. это работает на моей стороне XCode версии 9.2

UIAlertController * alert=   [UIAlertController
                              alertControllerWithTitle:nil
                              message:nil
                              preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction* btn1 = [UIAlertAction
                       actionWithTitle:@"OKAY"
                       style:UIAlertActionStyleDefault
                       handler:^(UIAlertAction * action)
                       {

                       }];

[self presentViewController:alert animated:YES completion:nil];
Другие вопросы по тегам