17

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

是不是因为滥用而不可能UIAlertController,或者我应该怎么做?我正在尝试将 UITableView 合并到 UIAlertController 中UIAlertControllerStyleAlert

谢谢。

4

4 回答 4

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"];

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

在生产中使用这种方法可能会有风险,我不建议将它用于重要警报。

于 2014-11-08T17:49:24.967 回答
12

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

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

SDCAlert查看演示 gif

我在 Yahoo YMPromptKit 中使用这个库来自定义推送通知提示,看起来与 iOS 原生的完全一样。这是另一个例子:

在此处输入图像描述

于 2015-10-31T18:59:27.443 回答
2

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

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

于 2014-09-19T19:38:55.553 回答
1

您可以使用我的 UIAlertController 类别只用一行代码来完成它,并替换应用程序中的现有警报,请在此处查看

在此处输入图像描述

于 2016-01-17T18:22:39.320 回答