快速显示 UIAlertView 时出错

Posted

技术标签:

【中文标题】快速显示 UIAlertView 时出错【英文标题】:Error showing a UIAlertView in swift 【发布时间】:2014-06-04 14:41:22 【问题描述】:

我试图在我的 swift App 中显示 UIAlertView

    alert = UIAlertView(title: "",
        message: "bla",
        delegate: self,
        cancelButtonTitle: "OK")
    alert!.show()

=> BAD_ACESS 错误: -[_UIAlertViewAlertControllerShim initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:] ()

所以我怀疑自己。我将其设置为零

    alert = UIAlertView(title: "",
        message: "bla",
        delegate: nil,
        cancelButtonTitle: "OK")
    alert!.show()

=> ARM_DA_ALIGN 错误: -[_UIAlertViewAlertControllerShim initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:] ()


完整代码

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UIAlertViewDelegate 

    @lazy var window = UIWindow(frame: UIScreen.mainScreen().bounds)
    @lazy var locationManager = CLLocationManager()
    var alert: UIAlertView? = nil

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool 
        //setup dummy window
        self.window.backgroundColor = UIColor.whiteColor()
        self.window.rootViewController = UIViewController()
        self.window.makeKeyAndVisible()

        alert = UIAlertView(title: "",
            message: "bla",
            delegate: nil,
            cancelButtonTitle: "OK")
        alert!.show()

    return true
    

怎么做才对? :)

【问题讨论】:

How would I create a UIAlertView in Swift?的可能重复 它确实转到 _UIAlertViewAlertControllerShim 所以我觉得这是一个错误——我的意思是。弃用不应该意味着不再可用:) @JohnRiselvato 它肯定不会:en.wikipedia.org/wiki/Deprecation @JohnRiselvato 我不想要东西 if(ios8) UIAlertViewController else UIAlertView :) UIAlertView in Swift, getting EXC_BAD_ACCESS 的可能副本 【参考方案1】:

斯威夫特 5

你应该这样做:

let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Button", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)

【讨论】:

我会尝试,但不推荐使用并不意味着损坏。我有大量使用 UIAlertViews 的代码......哦,好吧 en.wikipedia.org/wiki/Deprecation -- 但我想它现在还没有实现 是的,我绝对不会期望 UIAlertView 这种事实上的构造会在 iOS 8、Swift 或其他版本中抛出 EXC_BAD_ACCESS。这一切都发生在我使用 Swift 的前 10 分钟;嗯,系好安全带,让乐趣开始吧! @itedi 不幸的是,是的。 “旧” UIAlertView 仍然可用,但您会收到已弃用的警告。请参阅约翰的回答。 当 OP 明确要求 UIAlertView 并且 UIAlertController 无法在 iOS 7 上运行时,为什么人们会使用 UIAlertController 代码进行响应,而 iOS 7 目前大约 50% 的设备上运行?!【参考方案2】:

即使UIAlertView 在 iOS8 中已被贬低,您也可以使用它,但不能通过它的 init 函数。例如:

    var alert = UIAlertView()
    alert.title = "Title"
    alert.message = "message"
    alert.show()

至少这是迄今为止我能够成功使用UIAlertView 的唯一方法。不过,我不确定这有多安全。

【讨论】:

【参考方案3】:

这是我用来快速弹出警报的方法。

let myAlert = UIAlertView(title: "Invalid Login",     
message: "Please enter valid user name",       
delegate: nil, cancelButtonTitle: "Try Again") 
myAlert.show()

【讨论】:

【参考方案4】:
var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)

处理动作:

alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler:  
    action in switch action.style 
    case .Default:
        println("default")
    case .Cancel:
        println("cancel")
    case .Destructive:
        println("destructive")
    
))

【讨论】:

【参考方案5】:

我使用此代码成功地显示了 UIAlertView:

var alert = UIAlertView()
alert.title = "Title"
alert.message = "Message"
alert.addButtonWithTitle("Understood")
alert.show()

代码“alert.addButtonWithTitle("Understood")" 添加一个按钮供用户在阅读错误消息后按下。

希望对你有所帮助。

【讨论】:

【参考方案6】:

Xcode 10,Swift 4.2 版本

        let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "Button", style: UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil)

【讨论】:

【参考方案7】:
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: UIAlertController.Style.alert)
                    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil))
                    self.present(alert, animated: true, completion: nil)

【讨论】:

以上是关于快速显示 UIAlertView 时出错的主要内容,如果未能解决你的问题,请参考以下文章

显示蜂窝数据已关闭警报

在 AFHTTPRequestOperation 失败时显示 UIAlertView

如何快速在 UIAlertView 中添加 UITableView

快速连续多次创建 UIAlertView

如何防止多个 UIAlertView 堆叠?

applicationWillTerminate 问题