场景:用户点击视图控制器上的按钮.视图控制器是导航堆栈中最顶层的(显然).TAP调用在另一个类上调用的实用程序类方法.那里发生了一件糟糕的事情,我想在控制返回到视图控制器之前立即在那里显示一个警告.

+ (void)myUtilityMethod {
    // do stuff
    // something bad happened, display an alert.
}

对于UIAlertView个,这是可能的(但可能不太合适).

在这种情况下,如何在myUtilityMethod中呈现UIAlertController

推荐答案

几个月前我发了一个similar question分,我想我终于解决了这个问题.如果您只想查看代码,请点击我帖子底部的链接.

解决方案是使用额外的UIWindow.

当您想显示UIAlertController时:

  1. 使您的窗口成为关键字和可见窗口(window.makeKeyAndVisible())
  2. 只需使用普通的UIViewController实例作为新窗口的rootViewController.(window.rootViewController = UIViewController())
  3. 在窗口的rootViewController上显示UIAlertController

有几点需要注意:

  • 您的UIWindow必须是强引用的.如果它没有被强烈引用,它将永远不会出现(因为它已被发布).我建议使用一处房产,但我也成功地使用了associated object.
  • 为了确保窗口显示在所有其他窗口之上(包括系统UIAlertController),我设置了windowLevel.(window.windowLevel = UIWindowLevelAlert + 1)

最后,我有一个完整的实现,如果你想看看的话.

https://github.com/dbettermann/DBAlertController

Ios相关问答推荐

带外部笔划的圆形进度视图

preferredCompactColumn作为NavigationSplitViewColumn.sidebar传递,但仍能在iOS上看到详细信息页面

SWIFT根据地球坐标修改 node 旋转

删除领域中的cartItem时出现问题

Xcode 15中的版本控制发生了什么?

CoreML 不能并发(多线程)工作?

Flutter firebase_auth 中的无效应用程序凭据/令牌不匹配

Flutter iOS 构建失败并在 ios/Runner/AppDelegate.swift 中出现多个错误

如何在swiftui中更改可搜索的搜索图标 colored颜色

Xcode 14 弃用了位码 - 但为什么呢?

如何识别 SwiftUI 中点击的按钮 ID 以使该按钮动画化?

如何将私钥添加到分发证书?

在 UICollectionView 上动态设置布局导致莫名其妙的 contentOffset 变化

如何使用 sendAsynchronousRequest:queue:completionHandler:

如何比较两个 UIImage 对象

@IBDesignable 崩溃代理

如何在 Objective-C (iOS) 中的图像上写文本?

是否可以将 Socket.io 与 AWS Lambda 一起使用?

Objective-C 将 NSDate 设置为当前 UTC

NSURL 到带有 XCTest 的测试包中的文件路径