2016-01-04 5 views
12

Я хотел бы реализовать UIAlertViewController как это (Ссылка: Страницы и Keynote приложение):Как настроить UIAlertController с UITableView или имеется ли какой-либо элемент управления по умолчанию, подобный этому интерфейсу в приложении «Страницы»?

enter image description here.

Я внедрил пользовательское табличное представление и представил представление, имитируя 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]; 
} 
+0

есть все равно, чтобы поп uitableview от uialertviewcontroller. – SMS

+0

вы хотите достичь этой функциональности только с помощью UITableView. – Ricky

+0

См. Мой ответ. Я реализовал это несколько раз, и это очень просто. –

ответ

5

UIAlertController имеет частный contentViewController объект который позволяет вам установить любой подкласс UIViewController как часть контроллера предупреждения. Он отлично работает как с листами действий, так и с оповещениями. Вы можете смешивать контроллер контента с другими действиями оповещения.

Это как UIActivityViewController, контроллер предварительного просмотра Airdrop и т. Д. Реализованы.

Лучшая практика подкласс UIAlertController, и в любом initWithNibName:bundle: или viewDidLoad, используйте setValue:forKey: установить contentViewController свойства. Не забудьте установить preferredContentSize для вашего контроллера содержимого.

+4

«Лучшей практикой является подкласс« UIAlertController »... ... ну, нет. Из документов: «Класс UIAlertController предназначен для использования как есть и не поддерживает подклассы». – Firo

+0

@Firo Мы говорим о частном API здесь. Я могу подтвердить, что он работает хорошо. –

+4

Я никоим образом не сомневаюсь, что это работает. Просто не считал бы это «лучшей практикой». Я не вижу ссылки на OP, говорящие о частных API, вот и все. – Firo

0

Я думаю, вы должны использовать UIAlertController с preferredStyle набором для UIAlertControllerStyleActionSheet.

Но если этого недостаточно, начните с нуля, от UIWindow и UIViewController с помощью tableView и сделайте любой пользовательский интерфейс, который вам нужен, существует множество пользовательских реализаций alertView. Я уверен, что вы легко нашли его, например.

+0

UIAlertcontroller, есть ли способ настроить его с изображениями с правой стороны, я уже пробовал UIAlertcontroller, но не мог достичь того же требования. Пожалуйста, поделитесь мной примером кода, если он может мне помочь. – SMS

1

Добавление к ответу Лео, да, есть частная собственность на UIAlertControllercontentViewController, который позволяет установить UIViewController (и это мнение) как содержание UIAlertController.

Вы можете создать частный интерфейс для доступа к этой недвижимости без использования КВО или импортировать частный заголовок так:

@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"); 
}]; 

Present, как ваш обычно:

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

Более подробную информацию о частных API UIAlertController можно найти на iPhone Dev Wiki article on UIAlertController.

Я также проверил бы частные интерфейсы на _UIAlertControllerActionView и UIAlertAction, а также протокол UIAlertActionViewRepresentation_Internal.

+0

Не переопределяйте 'preferredContentSize'. Это свойство, установите его. –

+0

@LeoNatan не 'preferredContentSize' объявлен как' readonly' на 'UIViewController', хотя? – JAL

+0

А? '@property (nonatomic) CGSize preferredContentSize' –