【问题标题】:Should UIAlertView be subclassed?UIAlertView 应该被子类化吗?
【发布时间】:2014-01-08 21:36:24
【问题描述】:

我确信答案是“”,因为文档非常清楚。但我有点困惑。一个标准的UIAlertView 相当乏味,我想改善外观,似乎其他应用程序也这样做(见下面的示例)。

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

页面UIAlertViews 状态

警报视图的外观

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

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

【问题讨论】:

  • “UIAlertView 类旨在按原样使用,不支持子类化” - 理论上。这意味着您不应该对它进行子类化。 (但是,我怀疑它不能完成——它只是一个类,您当然可以从技术上继承另一个类,但这是个坏主意。)跨度>
  • 我可以做到,而且我已经做到了,但我想问的是,如果 Apple 对子类化说“不”,上述如何完成。
  • Apple可能使用 UIAlertView 的私有子类,然后子类 UIAlertView 不会有太大帮助。
  • 要完全拥有类似的行为,您还必须创建一个警报 UIWindow。

标签: ios objective-c cocoa-touch uialertview


【解决方案1】:

不,不要子类化它。来自文档:

子类化注释

UIAlertView 类旨在按原样使用 并且不支持子类化。这个类的视图层次结构是 私有,不得修改。

您可以做的是创建一个 UIView 并让它的行为类似于 UIAlertView。这不是很困难,并且似乎是他们在你的操作中所做的。

【讨论】:

  • 谢谢。你会说他们在我的例子中所做的吗?
  • 是的,我相信是这样,作为 UIAlertview 的子类似乎有点过头了。
【解决方案2】:

Apple 的文档说您不应该对它进行子类化。这意味着可能有内部原因使其难以正常工作。

您可能会也可能无法使 UIAlertView 的子类正常工作,但这样做的风险由您自己承担,未来的 iOS 版本可能会在没有警告的情况下让您崩溃。如果你试图抱怨,Apple 会笑着告诉你“我告诉过你”。

最好创建一个外观和行为都类似于警报的视图,但它是您自己的自定义视图/视图控制器。请注意,即使这样也很危险,因为 Apple 最近一直在对其 UI 元素的外观和感觉进行彻底的更改。如果你实现一个看起来和行为类似于当前警报视图的变体的视图控制器,Apple 可能会在未来改变这种外观和/或行为,你的 UI 应用程序最终会看起来很奇怪和过时。我们以前也被这种东西咬过。

【讨论】:

  • 感谢您的建议。那么我是否坚持使用苹果给我们的枯燥的东西?感觉有点可惜。
  • 差不多,是的。 Dull 至少是一贯的和熟悉的。
【解决方案3】:

重新考虑您的策略。为什么需要使用警报视图?除了将模态视图显示在视图堆栈的最顶部之外,它没有太多其他功能。相反,继承 UIView 或 UIViewController 来定义您自己的界面,使用图像和 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。

希望这会有所帮助。

【讨论】:

【解决方案4】:

不。您绝对不应该以任何理由将UIAlertView 子类化。 Apple explicitly states 这在他们的文档中(参见“子类化注释”)。他们甚至告诉您它依赖于私有方法 - 我们都知道在 AppStore 应用程序中干预私有方法会立即被拒绝。

然而,没有必要在 iOS 7 上继承 UIAlertView。Apple 在 iOS 7.0 中引入了一个新的自定义 ViewController 转换功能,让您可以通过完全自定义的转换呈现完全自定义的 ViewController。换句话说,您可以非常轻松地制作自己的 UIAlertView 甚至更好的东西。关于新功能here有一个很好的教程:

事实上,这方面有很多很好的教程 - 快速Google search on the topic 会发现大量信息。

【讨论】:

  • 谢谢,我很感激。可悲的是,我仍然坚持使用 Xcode 4.6,因为 iMac 对于 iOS 7 等所需的 Xcode 5 来说太旧了,但我会看看 - 干杯。
  • 你也许可以用 iOS 6 模态视图控制器做类似的事情......虽然我怀疑它是否更灵活,它肯定是“hacky”。
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 2012-10-25
  • 2012-07-21
  • 1970-01-01
  • 2014-02-05
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多