私は表示したい画像へのパスを含むリモートプッシュ通知から電話を受けています。iOS AppDelegateからView Controller関数を呼び出すにはどうすればよいですか?
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
}
...とビューは次のようになります:
AppDelegateである
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
がnullであると言った例外を取得しています(それが@IBOutlet weak var poolImage: UIImageView!
、私として宣言されていますボタンをクリックしてloadImage("http://lorempixel.com/400/200/")
を呼び出して画像を表示することができます。
私はstackoverflowに関するいくつかの関連する回答を見つけました上にnced)しかし、何も働かない。
あなたは、VC変数への強い参照を保持していましたか? –
通知を受け取ったときにそれが実際にコードであれば、View Controllerの新しいインスタンスが作成されます。新しいインスタンスのUIは、表示されるまで初期化されないため、イメージビューはnullです。すでに画面に表示されているビューコントローラへのポインタを取得し、新しいコントローラを作成する必要はありません。 – Simon
@Simonだから私はそのメソッドの1つを呼び出すことができるように、appdelegateから既存のView Controllerへのポインタをどのように取得するのですか? – sagism