Как настроить UIAlertController с UITableView или имеется ли какой-либо элемент управления по умолчанию, подобный этому пользовательскому интерфейсу в приложении "Страницы"?
Я хотел бы реализовать UIAlertViewController
как это (ссылка: страницы и приложение Keynote):
.
Я внедрил пользовательское табличное представление и представил представление, подражая UIAlertViewController
. Но я не могу достичь аналогичного интерфейса, как указано выше. Есть ли для этого контроллер по умолчанию?
-(void)share:(id)sender
{
[self setModalPresentationStyle:UIModalPresentationCurrentContext];
AlertViewController *renameCntrl = [self.storyboard instantiateViewControllerWithIdentifier:AlertTblViewidentifier];
renameCntrl.optionViewDelegate = self;
renameCntrl.providesPresentationContextTransitionStyle = YES;
renameCntrl.definesPresentationContext = YES;
[renameCntrl setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:renameCntrl animated:YES completion:nil];
}
Ответы
Ответ 1
UIAlertController
имеет частное свойство contentViewController
, которое позволяет вам установить любой подкласс UIViewController
как часть контроллера предупреждения. Он отлично работает как с листами действий, так и с оповещениями. Вы можете смешивать контроллер контента с другими действиями по предупреждению.
Вот как реализованы UIActivityViewController
, контроллер предварительного просмотра Airdrop и т.д.
Лучшей практикой является подкласс UIAlertController
, а в initWithNibName:bundle:
или viewDidLoad
используйте setValue:forKey:
, чтобы установить свойство contentViewController
. Не забудьте установить preferredContentSize
для вашего контроллера представления содержимого.
Ответ 2
Добавив к Лео ответ, да, в UIAlertController
contentViewController
есть частная собственность, которая позволяет вам установить UIViewController
(и его представление) как содержимое UIAlertController
.
Вы можете создать частный интерфейс для доступа к этому свойству, не используя KVO или импортируя закрытый заголовок, например:
@interface UIAlertController (ContentViewController)
@property (nonatomic, strong) UIViewController * contentViewController;
@end
Затем разместите свой пользовательский вид в контроллере содержимого view
, через Interface Builder или программно.
Помните, что вам также необходимо переопределить контроллер вида preferredContentSize
:
- (CGSize)preferredContentSize {
CGSize contentSize = [super preferredContentSize]; //gets the preferredContentHeight from the view, will be set depending on how much content we have
return CGSizeMake(contentSize.width, self.view.preferredContentHeight);
}
Примечание: вместо того, чтобы переопределять геттер, Лео Натан предлагает установить preferredContentSize
напрямую, поскольку он является свойством на UIViewController
.
Вы также можете переопределить свой контроллер просмотра view
в своем подклассе, если хотите.
Настройте свое предупреждение как обычно:
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message"
preferredStyle:UIAlertControllerStyleActionSheet];
Задайте свой пользовательский вид:
[alertController setContentViewController:[[MyContentViewController alloc] init]];
Добавьте свои действия:
[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^{
NSLog(@"Cancel Button was pressed");
}];
Представьте, как обычно:
[self presentViewController:alertController animated:YES completion:nil];
Более подробную информацию о частных API-интерфейсах UIAlertController
можно найти в статье обозревателя iPhone на UIAlertController.
Я также проверил бы частные интерфейсы на _UIAlertControllerActionView
и UIAlertAction
, а также UIAlertActionViewRepresentation_Internal
протокол.
Ответ 3
Я думаю, вы должны использовать UIAlertController
с preferredStyle
, установленным в UIAlertControllerStyleActionSheet
.
Но если этого недостаточно, начните с нуля, от UIWindow
и UIViewController
с помощью tableView и сделайте любой пользовательский интерфейс, который вы хотите, существует множество пользовательских реализаций alertView. Я уверен, что вы легко нашли его, например.