Я получаю звонок от удаленного push-уведомления, который включает в себя путь к изображению, который я хочу отобразить.Как я могу вызвать функцию контроллера вида из iOS AppDelegate?
AppDelegate является:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
// get url from notification payload (shortened version)
let url = alert["imgurl"] as? NSString
let vc = ViewController()
vc.loadImage(url as String) // cannot find the imageView inside
}
... и вид выглядит следующим образом:
func loadImage(url:String) {
downloadImage(url, imgView: self.poolImage)
}
// http://stackoverflow.com/a/28942299/1011227
func getDataFromUrl(url:String, completion: ((data: NSData?) -> Void)) {
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) { (data, response, error) in
completion(data: NSData(data: data!))
}.resume()
}
func downloadImage(url:String, imgView:UIImageView){
getDataFromUrl(url) { data in
dispatch_async(dispatch_get_main_queue()) {
imgView.image = UIImage(data: data!)
}
}
}
Я получаю исключение, говоря imgView
является недействительным (он объявлен как @IBOutlet weak var poolImage: UIImageView!
и I может отображать изображение, позвонив по телефону loadImage("http://lorempixel.com/400/200/")
.
Я нашел пару связанных ответов на stackoverflow (один из них ссылается но никто не работает.
ли вы сохранить сильную ссылку на В.- переменную? –
Если это ваш код, когда вы получаете уведомление, то вы создаете новый экземпляр вашего контроллера. Представление вашего изображения равно null, поскольку пользовательский интерфейс нового экземпляра не будет инициализирован до тех пор, пока он не будет отображаться. Вам нужно получить указатель на контроллер вашего вида, который уже находится на экране, а не создавать новый. – Simon
@Simon так как я могу получить указатель на существующий контроллер представления из appdelegate, чтобы я мог назвать один из его методов? – sagism