在iOS 8中自定义UIAlertController以包含UITableView等标准元素

kbj*_*sen 17 customization uialertview ios8 uialertcontroller

我习惯UIAlertViews通过[ alert setValue:someView forKey:@"accessoryView"]方法来定制.这为UIAlertViews创建了具有自定义高度的可自定义内容.但它只适用于iOS7及以下版本.在iOS8中UIAlertController已经接管了,我不能再自定义它了,它会削减它的高度UIAlertView.

是不是因为误用了UIAlertController,或者我该怎么做呢?我试图在UIAlertController中包含一个UITableView UIAlertControllerStyleAlert.

谢谢.

Jon*_*asG 36

我现在遇到了同样的问题.我查看了UIAlertController的私有标题(https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIAlertController.h),发现了一个很有前途的属性:contentViewController

事实证明它accessoryView与以前用于UIAlertView的完全相同,不同之处在于您需要将UIViewController分配给此属性而不是UIView.

UIViewController *v = [[UIViewController alloc] init];
v.view.backgroundColor = [UIColor redColor];

[alertController setValue:v forKey:@"contentViewController"];
Run Code Online (Sandbox Code Playgroud)

这段代码将在警报视图中显示红色视图!快乐的UIAlertController定制;)

PS.这是一个私人财产,但我认为使用KVC不应该是App Store明智的问题.

编辑:

有人抱怨说这不太安全.它不是公共API,所以是的,Apple可以在任何版本中更改它,导致此方法失败.

要确保整个应用程序不会崩溃,如果发生这种情况,您可以将KVC调用包装在一个try块中.如果属性更改,您的控制器将不会显示内容视图,但它也不会崩溃:

@try {
    [alertController setValue:v forKey:@"contentViewController"];
}
@catch(NSException *exception) {
    NSLog(@"Failed setting content view controller: %@", exception);
}
Run Code Online (Sandbox Code Playgroud)

在生产中使用此方法可能存在风险,我不建议将其用于重要警报.

  • 几年前,我们使用KVO做了类似的事情来访问`UIAlertView`上的`_buttons`.然后,他们更改了标识符的名称,我们所有的IAP都停止在iOS 8上运行.几天内没有用完20个应用程序的修复程序.我强烈建议***对抗***这个解决方案 (11认同)
  • 问题是你强烈*建议的是什么? (3认同)

Ada*_*lan 11

我建议不要浪费时间尝试将额外的UI塞进一个不应该的地方.基于最近几年的改进,Apple可能会在下一个iOS中添加自定义视图.在此之前,请看一个旨在处理这种确切情况的框架,而不会破坏任何最佳实践:SDCAlertView

它支持模仿iOS 7,8,9上的本机警报的警报,包括处理所有关于大小调整,按钮类型,旋转等的令人讨厌的边缘情况.它确实支持警报中的任意自定义视图.

SDCAlertView演示gif

我在Yahoo YMPromptKit中使用这个库来获得与iOS原生完全相同的自定义推送通知提示.这是另一个例子:

在此输入图像描述