UIAlertView应该是子类吗?

时间:2014-01-08 21:36:24

标签: ios objective-c cocoa-touch uialertview

我确信答案是“没有”,因为文档非常明确。但我有点困惑。标准UIAlertView非常沉闷,我想改善外观,似乎其他应用程序也这样做(参见下面的示例)。

另一种可能性是它们不是子类UIAlertViews。在哪种情况下,这是如何实现的?

页面UIAlertViews说明

  

警示视图的外观

     

您无法自定义警报视图的外观。

那么我们如何获得类似于此处所示示例的内容?

enter image description here

4 个答案:

答案 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)

否。您绝对应该以任何理由继承UIAlertViewApple explicitly states这在他们的文档中(参见“Subclassing Notes”)。他们甚至告诉你它依赖于私有方法 - 我们都知道在AppStore应用程序中插入私有方法是拒绝的直接理由。

HOWEVER ,不需要在iOS 7上继承UIAlertView。Apple在iOS 7.0中引入了一个新的自定义ViewController Transitions功能,可让您完全自定义ViewControllers过渡。换句话说,您可以轻松制作自己的UIAlertView甚至更好的东西。关于新功能here的一个很好的教程:

enter image description here

事实上,有很多很好的教程 - 快速Google search on the topic可以提供大量的信息。