Как настроить 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. Я уверен, что вы легко нашли его, например.