Настроить UIAlertController в iOS 8 для включения стандартных элементов, таких как UITableView
Я использую для настройки UIAlertViews
с помощью метода [alert setValue:someView forKey:@"accessoryView"]
. Это создает настраиваемый контент для UIAlertViews с пользовательскими высотами. Однако он работает только на iOS7 и ниже. В iOS8 команда UIAlertController
взяла верх, и я больше не могу ее настраивать, она уменьшит высоту UIAlertView
.
Это невозможно из-за неправильного использования UIAlertController
, или как я должен это делать?
Я пытаюсь включить UITableView внутри UIAlertController с UIAlertControllerStyleAlert
.
спасибо.
Ответы
Ответ 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 и заменить существующие предупреждения в приложении, проверьте здесь.
![введите описание изображения здесь]()