从自定义调用 presentViewController class

Calling presentViewController from custom class

我阅读了 and this one 如何在 UIViewController 子外部调用 presentViewController 表单class。在我的例子中,自定义 class 是 NSObject 的子class。以下方法是唯一有效的方法(来自我阅读的示例):

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)

我的问题:是否有更好的解决方案不依赖于 appDelegate(据我了解,这种方法在设计方面不是很整洁)...

我有时会创建一个实用程序 class 来显示警报等。我通常做的是让我的呈现视图控制器的方法将当前视图控制器作为参数。这种方法效果很好。

编辑:

这是我的一个项目中文件 Utils.swift 中的示例方法。它定义了一个 class 函数,在当前视图控制器上显示一个 UIAlertController 警报:

class Utils
{
  static let sharedUtils = Utils()
  
  class func showAlertOnVC(
    targetVC: UIViewController, 
    var title: String, 
    var message: String)
  {
    title = NSLocalizedString(title, comment: "")
    message = NSLocalizedString(message, comment: "")
    let alert = UIAlertController(
      title: title, 
      message: message, 
      preferredStyle: UIAlertControllerStyle.Alert)
    let okButton = UIAlertAction(
      title:"OK",
      style: UIAlertActionStyle.Default,
      handler:
      {
        (alert: UIAlertAction!)  in
    })
    alert.addAction(okButton)
    targetVC.presentViewController(alert, animated: true, completion: nil)
  }
}

上面的代码定义了一个class Utils。请注意,它没有任何基数 class,这在 Swift.

中是可以的

接下来它定义了一个 public 静态变量 sharedUtils,您可以使用它来访问单例 Utils class。

最后,它定义了一个 class 方法 showAlertOnVC,可用于在当前视图控制器顶部显示 UIAlertController 警报。要使用 showAlertOnVC,您可以从当前视图控制器调用它并将 self 作为 targetVC 参数传递。

我认为这是最简单的解决方案:

class Utils {
  static  func displayTheAlert(targetVC: UIViewController, title: String, message: String){
        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction((UIAlertAction(title: "OK", style: .Default, handler: {(action) -> Void in
        })))
        targetVC.presentViewController(alert, animated: true, completion: nil)
    }
}

// 然后调用它

Utils.displayTheAlert(self, title: "Fout", message: "Uw bestelling is nog niet klaar")

从View的设计角度来说,模型class(NSObject)直接与View交互是不可取的。它不符合 MVC 模式。避免在 NSObject class.

中使用 UIKIT