我想像这样实现UIAlertViewController
(参考:Pages和Keynote应用程序):
我已经实现了自定义的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];
}
答案 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上找到。
我还会检查_UIAlertControllerActionView
和UIAlertAction
上的私有接口,以及UIAlertActionViewRepresentation_Internal
协议。
答案 2 :(得分:0)
我认为您应该UIAlertController
使用preferredStyle
设置为UIAlertControllerStyleActionSheet
。
但是,如果这还不够,从UIWindow
和UIViewController
开始使用tableView并创建你想要的任何UI,那么有很多自定义alertView实现我相信你很容易找到一个例如。