Swift 4.2 - Как использовать Alert в функции enum? - PullRequest
0 голосов
/ 10 сентября 2018

Я получил это

#if os(iOS)
import UIKit
import Foundation
#elseif os(OSX)
import Foundation
import cocoa
#else
// Future concerns
#endif


enum Image: String {
    case Preferences
    ....
    case App
    case Stop
    ....
    case Default


    #if os(iOS)
    func image(selected: Bool = false) -> UIImage? {
        let imgName : String = selected ? self.rawValue + "-selected" : self.rawValue
        if let img = UIImage(named:imgName) {
            return img
        } else {
            print("iOS")
            print("Please add the \(imgName) icon to the app assets!!")
            //Creating the alert
            let alertController = UIAlertController(title: "Icon Missing", message: "Please add the \(imgName) image to the app assets!!", preferredStyle: .alert)
            let action = UIAlertAction(title: "I Promiss I will", style: .default, handler: nil)
        alertController.addAction(action)
        // How to get the alert working
     self.window?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
       //
            return nil
        }
    }
    #elseif os(OSX)
    func image(selected: Bool = false) -> NSImage? {
        ....
    }
    #else
    //
    #endif
}

Я знаю, что enum не имеет self.window, я просто набираю эту строку (self.window? .RootViewController? ...), чтобы показать проблему. Есть ли где-нибудь, чтобы заставить работать оповещение? Конечно, я не хочу отправлять объект просмотра в Image.Question.image (). Также, если это будет использоваться на более позднем этапе разработки, это будет дискуссионным, но все же хотите узнать, есть ли способ.

Заранее спасибо.

======== Решено =========

С помощью информации и комментариев от k.zoli моя главная проблема была решена.

результирующий код

func image(selected: Bool = false) -> UIImage? {
        let imgName : String = selected ? self.rawValue + "-selected" : self.rawValue
        guard let img = UIImage(named: imgName) else {
            print("iOS")
            print("Please add the \(imgName) icon to the app assets!!")
            //Creating the alert
            let alertController = UIAlertController(title: "Icon Missing", message: "Please add the \(imgName) icon to the app assets!!", preferredStyle: .alert)
            let action = UIAlertAction(title: "I Promiss I will", style: .default, handler: nil)
            alertController.addAction(action)
            if let window = UIApplication.shared.delegate?.window { DispatchQueue.main.async { window?.rootViewController?.present(alertController, animated: true, completion: nil) } }
            return nil
        }
        return img
    }

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете получить доступ к текущему окну через общий экземпляр UIApplication.

if let window = UIApplication.shared.delegate?.window {
        window?.rootViewController?.present(alertController, animated: true, completion: nil)
    }
...