How to customize UIAlertController with UITableView or is there any default control available like this UI in Pages app?

后端 未结 3 894
不知归路
不知归路 2020-12-29 09:50

I would like to implement a UIAlertViewController like this (Reference: Pages and Keynote app):

.

I have implemented a custom tableview and pres

3条回答
  •  既然无缘
    2020-12-29 10:09

    Adding on to Leo's answer, yes, there is a private property on UIAlertController contentViewController which allows you to set a UIViewController (and it's view) as the content of the UIAlertController.

    You can create a private interface to access this property without using KVO or importing a private header like so:

    @interface UIAlertController (ContentViewController)
    @property (nonatomic, strong) UIViewController * contentViewController;
    @end
    

    Then, layout your custom view in your content view controller's view, via Interface Builder or programmatically.

    Remember that you also need to override your view controller's 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); 
    }
    

    Note: rather than overriding the getter, Leo Natan suggests setting the preferredContentSize directly, since it is a property on UIViewController.

    You can also override your view controller's view in your subclass as well, if you want.

    Set up your alert as your normally would:

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" 
                                                                                        preferredStyle:UIAlertControllerStyleActionSheet];
    

    Set your custom view:

    [alertController setContentViewController:[[MyContentViewController alloc] init]];
    

    Add your actions:

    [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^{
                           NSLog(@"Cancel Button was pressed");
    }];
    

    Present as your normally would:

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

    More information on the private APIs of UIAlertController can be found on the iPhone Dev Wiki's article on UIAlertController.

    I would also check out the private interfaces on _UIAlertControllerActionView and UIAlertAction, as well as the UIAlertActionViewRepresentation_Internal protocol.

提交回复
热议问题