我确信答案是“没有”,因为文档非常明确。但我有点困惑。标准UIAlertView
非常沉闷,我想改善外观,似乎其他应用程序也这样做(参见下面的示例)。
另一种可能性是它们不是子类UIAlertViews
。在哪种情况下,这是如何实现的?
页面UIAlertViews说明
警示视图的外观
您无法自定义警报视图的外观。
那么我们如何获得类似于此处所示示例的内容?
答案 0 :(得分:4)
不,不要继承它。来自文档:
子类注释
UIAlertView类旨在按原样使用 并且不支持子类化。此类的视图层次结构是 私人,不得修改。
你可以做的是创建一个UIView并让它的行为类似于UIAlertView。这不是很困难,似乎是他们在你的行动中所做的。
答案 1 :(得分:3)
Apple的文档说你不应该继承它。这意味着可能存在内部原因使其难以正常工作。
您可能会或者可能无法使UIAlertView的子类工作,但您这样做需要您自担风险,未来的iOS版本可能会在没有任何警告的情况下打破您。如果你试图抱怨苹果会笑并告诉你“我告诉你了”。
最好创建一个外观和行为类似于警报的视图,但它是您自己的自定义视图/视图控制器。请注意,即使这很危险,因为Apple最近对其UI元素的外观和感觉进行了彻底的改变。如果您实现一个视图控制器,其外观和行为类似于当前警报视图的变体,Apple可能会在将来更改该外观和/或行为,并且您的UI应用程序最终会看起来很奇怪且过时。我们之前一直被这种事情所困扰。
答案 2 :(得分:3)
重新思考你的策略。为什么需要使用警报视图?除了在视图堆栈上显示最顶层的模态视图外,它没有其他功能。相反,子类UIView或UIViewController定义您自己的接口,使用images和ui元素根据需要为其提供样式和输入功能。
我通常将UIView子类化,并将其附加到应用程序窗口的视图中,以便我确定它将显示在其他任何内容之上。你可以使用块来为新视图的各种输入元素提供钩子(用户按OK,还是用户输入文本?)
例如:
// Instantiate your custom alert
UIView *myCustomAlert = [[UIMyCustomUIViewAlert alloc] initWithFrame:CGRectMake(...)];
// Suppose the new custom alert has a completion block for when user clicks on some button
// Or performs some action...
myCustomAlert.someEventHandler = ^{
// This block should be invoked internally by the custom alert view
// in response to some given user action.
};
// Display your custom alert view
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
[window addSubview: myCustomAlert];
// Make sure that your custom alert view is top-most
[window bringSubviewToFront: myCustomAlert];
但是,使用此方法不会像UIAlertView那样暂停线程的执行。使用此方法,一切都将继续照常运行。因此,如果您需要在显示自定义警报时暂停执行,那么它会变得更加棘手。
但是,否则,创建自己的自定义警报非常简单,就像您自定义任何其他视图一样。你甚至可以使用Interface Builder。
希望这有帮助。
答案 3 :(得分:2)
否。您绝对应该不以任何理由继承UIAlertView
。 Apple explicitly states这在他们的文档中(参见“Subclassing Notes”)。他们甚至告诉你它依赖于私有方法 - 我们都知道在AppStore应用程序中插入私有方法是拒绝的直接理由。
HOWEVER ,不需要在iOS 7上继承UIAlertView
。Apple在iOS 7.0中引入了一个新的自定义ViewController Transitions功能,可让您完全自定义ViewControllers过渡。换句话说,您可以轻松制作自己的UIAlertView甚至更好的东西。关于新功能here的一个很好的教程:
事实上,有很多很好的教程 - 快速Google search on the topic可以提供大量的信息。