我习惯通过[UIAlertViews
方法自定义alert setValue:someView forKey:@"accessoryView"]
。这为UIAlertViews创建了具有自定义高度的可自定义内容。但它只适用于iOS7及以下版本。在iOS8中,UIAlertController
已经接管,我无法再自定义它,它将削减UIAlertView
的高度。
是不是因为误用了UIAlertController
,或者我该怎么办?
我试图在UIAlertController中加入一个带有UIAlertControllerStyleAlert
的UITableView。
THX。
答案 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上的本机警报的警报,包括处理所有关于大小调整,按钮类型,旋转等的令人讨厌的边缘情况。它确实支持警报中的任意自定义视图。
我在Yahoo YMPromptKit中使用此库来获取与iOS原生文件完全相同的自定义推送通知提示。这是另一个例子:
答案 2 :(得分:2)
我认为您可以轻松自定义UIView添加所需的控件并以模态方式呈现它,除非您有任何其他特定原因仅使用UIAlertController。
答案 3 :(得分:1)
您只需使用我的UIAlertController类别中的一行代码并替换应用程序中的现有警报,就可以检查它here。