UIAlertView вылетает приложение на iOS 7

Я только что выпустил свое приложение в App Store, однако мне только что отправили электронное письмо, в котором он сообщил, что сбои возникают.

Проблема связана с Alert Views, который вылетает из моего приложения, когда они должны появиться (только в iOS 7). У меня был некоторый код, который должен был решить эту проблему, однако он не работает в определенных версиях iOS 7.

Вот мой текущий код:

@IBAction func resetAllButton(sender : AnyObject) {
    //If statement to check whether the modern style alert is available. Prior to iOS 8 it is not.
    if let gotModernAlert: AnyClass = NSClassFromString("UIAlertController") {

        println("UIAlertController can be instantiated")

        var alert = UIAlertController(title: "Start Over", message: "Are you sure you want to start over? This will erase your budget and all transactions.", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "I'm sure!", style: UIAlertActionStyle.Default, handler:{ (ACTION :UIAlertAction!)in
            self.resetView()
        }))
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))

        self.presentViewController(alert, animated: true, completion: nil)
    }
    else {

        println("UIAlertController can NOT be instantiated")

        var alertView = UIAlertView()
        alertView.delegate = self
        alertView.title = "Start Over"
        alertView.message = "Are you sure you want to start over? This will erase your budget and all transactions."
        alertView.addButtonWithTitle("I'm sure!")
        alertView.addButtonWithTitle("Cancel")
        alertView.show()
    }
}

Что я могу сделать, чтобы мое приложение не зависало ни на одной версии iOS 7 или 8?

2 ответа

У меня была та же проблема в сборке релиза. Кажется, внутренняя ошибка компилятора swift (с использованием Xcode 6.0.1 (6A317))

Я решил на самом деле с помощью вспомогательного класса objC с этим методом:

+ (BOOL) checkIfClassExists:(NSString *)className {
    id c = objc_getClass([className cStringUsingEncoding:NSASCIIStringEncoding]);
    if (c != nil) {
        return YES;
    } else {
        return NO;
    }
}

называется в моем быстром коде с заголовком моста

if ObjCFix.checkIfClassExists("UIAlertController") {
    //iOS 8 code here
} else {
    //iOS 7 code here
}

Вот мое быстрое решение для перетаскивания:

//Alerts change in iOS8, this method is to cover iOS7 devices
func CozAlert(title: String, message: String, action: String, sender: UIViewController){

    if respondsToSelector("UIAlertController"){
        var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: action, style: UIAlertActionStyle.Default, handler:nil))
        sender.presentViewController(alert, animated: true, completion: nil)
    }
    else {
        var alert = UIAlertView(title: title, message: message, delegate: sender, cancelButtonTitle:action)
        alert.show()
    }
}

Звоните так:

CozAlert("reportTitle", message: "reportText", action: "reportButton", sender: self)

Остерегайтесь, это только для самых основных предупреждений, вам может понадобиться дополнительный код для продвинутых вещей.

Другие вопросы по тегам