Подтвердить что ты не робот

Настроить UIAlertController в iOS 8 для включения стандартных элементов, таких как UITableView

Я использую для настройки UIAlertViews с помощью метода [alert setValue:someView forKey:@"accessoryView"]. Это создает настраиваемый контент для UIAlertViews с пользовательскими высотами. Однако он работает только на iOS7 и ниже. В iOS8 команда UIAlertController взяла верх, и я больше не могу ее настраивать, она уменьшит высоту UIAlertView.

Это невозможно из-за неправильного использования UIAlertController, или как я должен это делать? Я пытаюсь включить UITableView внутри UIAlertController с UIAlertControllerStyleAlert.

спасибо.

4b9b3361

Ответ 1

Я столкнулся с тем же вопросом прямо сейчас. Я просмотрел частный заголовок для UIAlertController (https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIAlertController.h) и нашел многообещающее свойство: contentViewController

И это оказалось точно таким же, как accessoryView для UIAlertView, разница в том, что вам нужно назначить UIViewController этому свойству, а не UIView.

UIViewController *v = [[UIViewController alloc] init];
v.view.backgroundColor = [UIColor redColor];

[alertController setValue:v forKey:@"contentViewController"];

Этот фрагмент кода отобразит красное представление в представлении предупреждения! Счастливая настройка UIAlertController;)

PS. Я думаю, что это частная собственность, но, используя KVC, не должно быть проблем с App Store.

Edit:

Некоторые люди жаловались, что это не очень безопасно. Это не общедоступный API, так что да, Apple может изменить его в любом выпуске, в результате чего этот метод будет терпеть неудачу.

Чтобы убедиться, что все ваше приложение не сработает, если это произойдет, вы можете обернуть вызов KVC в блок try. Если свойство изменится, ваш контроллер не отобразит представление содержимого, но он также не сработает:

@try {
    [alertController setValue:v forKey:@"contentViewController"];
}
@catch(NSException *exception) {
    NSLog(@"Failed setting content view controller: %@", exception);
}

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

Ответ 2

Я предлагаю не тратить время на то, чтобы втиснуть дополнительный интерфейс в место, где не должно быть. Основываясь на последних нескольких улучшениях, Apple, вероятно, добавит пользовательский вид в следующем iOS. До тех пор взгляните на структуру, предназначенную для обработки этой точной ситуации, без подрыва лучших методов: SDCAlertView

Он поддерживает оповещения, которые имитируют собственные оповещения на iOS 7,8,9, включая обработку всех неприятных кросс-дел вокруг размеров, типов кнопок, вращения и т.д. Он поддерживает произвольные пользовательские представления в предупреждении.

SDCAlertView demo gif

Я использую эту библиотеку в Yahoo YMPromptKit для пользовательских приглашений push-уведомлений, которые выглядят точно так же, как родной iOS. Вот еще один пример:

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

Ответ 3

Я думаю, вы можете легко настроить UIView, добавив необходимые элементы управления и представить его по-разному, если у вас нет другой конкретной причины использовать только UIAlertController.

https://www.cocoacontrols.com/search?q=UIAlertview

Ответ 4

Вы можете сделать это только с одной строкой кода, используя мою категорию UIAlertController и заменить существующие предупреждения в приложении, проверьте здесь.

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