Swift 4.2 - 如何在枚举函数中使用警报?

Posted

技术标签:

【中文标题】Swift 4.2 - 如何在枚举函数中使用警报?【英文标题】:Swift 4.2 - How to use an Alert in a enum function? 【发布时间】:2018-09-10 11:16:44 【问题描述】:

我知道了

#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
    

【问题讨论】:

目前已由 k.zoli 解决 - 不幸的是在 viewDidLoad 函数中无法使用 在 viewDidLoad 中,我遇到了崩溃,因为还没有视图是列表“Test.ViewController: 0x7fdb21c07bc0> 其视图不在窗口层次结构中!”。视图可见后,视图在层次结构中“然后它可以工作。在 viewDidAppear 中它可以工作。但是我在 viewDidLoad 中进行图像设置。使用最新的 k.zoli 示例,它在 viewDidLoad 中也很有效。 【参考方案1】:

您可以通过 UIApplication 的共享实例访问当前窗口。

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

【讨论】:

好主意。永远忘记 UIApplication。不幸的是,我得到“Test.ViewController: 0x7fdb21c07bc0> 其视图不在窗口层次结构中!” 对不起,当视图可见时,它确实有效。当然还没有在 ViewDidLoad func 中,这就是我设置图像的地方。所以它看起来像一个'不能做'。积分还不够。如果人们对我的问题给我一些分数,我可以为你的答案加分。无论如何,非常感谢。 你可以在这里看到:***.com/a/34692351/4696911 试试这个或者从 viewDidAppear 调用这个设置: if let window = UIApplication.shared.delegate?.window DispatchQueue.main.async window?.rootViewController? .present(alertController, 动画: true, 完成: nil) 确实将您的代码放入枚举图像函数中并且它可以工作。它等到视图处于层次结构/可见状态,然后警报出现。我仍然可以在 viedDidLoad 中进行设置。我无法弄清楚的一件事是,当我对 enum.image 函数进行两次调用时,f.e 问题和应用程序图像,例如 ( let imageQuestion =Image.Question.image() let imagePreferences =Image.Preferences.image( selected:true) ),我只看到一个警报。 - 我必须弄清楚什么是好的,1. 让应用程序在一个警报后退出,2. 还添加一个默认替换图像,3 一个带有丢失图像列表的警报 你可以找到topViewController 但是,我认为这会导致糟糕的用户体验。多个警报可能会使用户感到困惑。

以上是关于Swift 4.2 - 如何在枚举函数中使用警报?的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift 4.2枚举示例

使用NSStringEnumerationOptions.ByWords获取错误 - Swift 4.2

在 Swift 4.2 中,后台获取每秒都在工作

如何在 Swift 中使用警报视图解除 segue?

细说 Swift 4.2 新特性:Dynamic Member Lookup

在所有视图控制器中创建警报功能 - swift