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

时间:2014-09-17 17:21:24

标签: customization ios8 uialertview uialertcontroller

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

是不是因为误用了UIAlertController,或者我该怎么办? 我试图在UIAlertController中加入一个带有UIAlertControllerStyleAlert的UITableView。

THX。

4 个答案:

答案 0 :(得分:35)

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

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

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

[alertController setValue:v forKey:@"contentViewController"];

这段代码将在警报视图中显示红色视图!快乐的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);
}

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

答案 1 :(得分:11)

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

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

SDCAlertView demo gif

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

enter image description here

答案 2 :(得分:2)

我认为您可以轻松自定义UIView添加所需的控件并以模态方式呈现它,除非您有任何其他特定原因仅使用UIAlertController。

https://www.cocoacontrols.com/search?q=UIAlertview

答案 3 :(得分:1)

您只需使用我的UIAlertController类别中的一行代码并替换应用程序中的现有警报,就可以检查它here

enter image description here