如何使用UITableView自定义UIAlertController,或者在Pages应用程序中是否有像此UI一样的默认控件?

时间:2016-01-04 14:18:54

标签: ios uitableview uiactionsheet uialertcontroller

我想像这样实现UIAlertViewController(参考:Pages和Keynote应用程序):

enter image description here

我已经实现了自定义的tableview,并通过模仿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];
}

3 个答案:

答案 0 :(得分:8)

UIAlertController具有私有contentViewController属性,允许您将任何UIViewController子类设置为警报控制器的一部分。它适用于操作表或警报样式。您可以将内容视图控制器与其他警报操作混合使用。

这就是UIActivityViewController,Airdrop预览控制器等的实现方式。

最佳做法是继承UIAlertController,在initWithNibName:bundle:viewDidLoad中,使用setValue:forKey:设置contentViewController属性。别忘了为内容视图控制器设置preferredContentSize

答案 1 :(得分:1)

添加到Leo的答案,是的,UIAlertController contentViewController上有一个私有属性,允许您将UIViewController(和它的视图)设置为{{的内容1}}。

您可以创建一个私有界面来访问此属性,而无需使用KVO或导入私有标头,如下所示:

UIAlertController

然后,通过Interface Builder或以编程方式在内容视图控制器的@interface UIAlertController (ContentViewController) @property (nonatomic, strong) UIViewController * contentViewController; @end 中布局自定义视图。

请记住,您还需要覆盖视图控制器的view

preferredContentSize

注意:Leo Natan建议直接设置- (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); } ,而不是覆盖getter,因为它是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的更多信息可以在iPhone Dev Wiki的article on UIAlertController上找到。

我还会检查_UIAlertControllerActionViewUIAlertAction上的私有接口,以及UIAlertActionViewRepresentation_Internal协议。

答案 2 :(得分:0)

我认为您应该UIAlertController使用preferredStyle设置为UIAlertControllerStyleActionSheet

但是,如果这还不够,从UIWindowUIViewController开始使用tableView并创建你想要的任何UI,那么有很多自定义alertView实现我相信你很容易找到一个例如。