2016-10-13 7 views
1

У меня есть основной класс, AddFriendsController, который запускает следующую строку кода:Как показать оповещение из другого класса в Swift?

ErrorReporting.showMessage("Error", msg: "Could not add student to storage.") 

Я тогда этот ErrorReporting.swift файл:

Фонд импорта

class ErrorReporting { 
    func showMessage(title: String, msg: String) { 
     let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
     self.presentViewController(alert, animated: true, completion: nil) 
    } 
} 

Очевидно, что self Wouldn» т здесь, и дает мне ошибку. Как я могу ссылаться на текущий открытый контроллер представления (т. Е. AddFriendsController в этом случае), поскольку я желаю использовать этот же метод во многих разных быстрых файлах?

Спасибо.

+0

Создать расширение ShowMessage. Как расширение ErrorReporting. а затем ваша функция. – sourav

+0

@sourav Не могли бы вы объяснить более подробно? Тем не менее изучение быстрый ... – think123

+0

расширение ERRORREPORTING { Func ShowMessage (название: String, Сообщ: String) { LET предупреждения = UIAlertController (название: заголовок, сообщение: MSG, preferredStyle: UIAlertControllerStyle.Alert) alert.addAction (UIAlertAction (название: "Ok", стиль: UIAlertActionStyle.Default, обработчик: ноль)) self.presentViewController (предупреждение, анимированные: правда, завершение: ноль) }} – sourav

ответ

11

Вы можете создать метод расширения для UIApplication (к примеру), который будет верните свой topViewController:

extension UIApplication { 

    static func topViewController(base: UIViewController? = UIApplication.sharedApplication().delegate?.window??.rootViewController) -> UIViewController? { 
     if let nav = base as? UINavigationController { 
      return topViewController(nav.visibleViewController) 
     } 
     if let tab = base as? UITabBarController, selected = tab.selectedViewController { 
      return topViewController(selected) 
     } 
     if let presented = base?.presentedViewController { 
      return topViewController(presented) 
     } 

     return base 
    } 
} 

И затем ваш класс будет выглядеть следующим образом:

class ErrorReporting { 

    static func showMessage(title: String, msg: String) { 
     let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
     UIApplication.topViewController()?.presentViewController(alert, animated: true, completion: nil) 
    } 
} 

Метод должен быть static, чтобы быть в состоянии назвать его как ErrorReporting.showMessage.

+0

Блин это расширение так чертовски хороший XD –

+0

Это жизнь заставки! Так элегантно! Большое спасибо! –

2

Фактически, на мой взгляд, операция представления контроллера представления должна выполняться на примере UIViewController, а не в классе модели.

Простое решение для него, чтобы передать экземпляр UIViewController в качестве параметра

class ErrorReporting { 
    func showMessage(title: String, msg: String, `on` controller: UIViewController) { 
     let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
     controller.presentViewController(alert, animated: true, completion: nil) 
    } 
} 

И называют его, как показано ниже

ErrorReporting.showMessage("Error", msg: "Could not add student to storage.", on: self) 
2

Swift 3 вариант ответа Максима Musiienko было бы следующее:

extension UIApplication { 

    static func topViewController(base: UIViewController? = UIApplication.shared.delegate?.window??.rootViewController) -> UIViewController? { 

     if let nav = base as? UINavigationController { 
      return topViewController(base: nav.visibleViewController) 
     } 

     if let tab = base as? UITabBarController, let selected = tab.selectedViewController { 
      return topViewController(base: selected) 
     } 

     if let presented = base?.presentedViewController { 
      return topViewController(base: presented) 
     } 

     return base 
    } 
}