2014-09-08 28 views
13

Yeni dili Swift kullanarak bir iOS uygulaması yapıyorum. Artık, UIWebView kullanarak HTML içeriğini görüntüleyen bir HTML5 uygulaması. Uygulamanın yerel bildirimleri vardır ve ne yapmak istediğim, uygulama yerel bildirimi tıklatarak (dokunarak) ön plana girdiğinde UIWebView'de belirli bir javascript yöntemini tetiklemektir.Uygulama iOS'ta yerel bir bildirimden ön plana girdiğinde belirli bir eylemi tetikleme? (hızlıca kullanarak)

Bu question'a bir baktım, ancak sorunumu çözmüyor gibi görünüyor. UIApplicationState'i kullanmamı söyleyen bu question numaralı telefona da rastladım. Bu, uygulamanın bir bildirimin ön plana girmesini bilmeme yardımcı olacak kadar iyi. Ancak uygulama devam ettiğinde ve uygulama devam ettiğinde görüntülenen görünümün viewController'ında bir yöntemi nasıl çağırırım?

Yapmak istediğim, ViewController'ımın bir örneğini almak ve bir özelliği true değerine ayarlamaktır. Bir şey

class FirstViewController: UIViewController,UIWebViewDelegate { 
    var execute:Bool = false; 
    @IBOutlet var tasksView: UIWebView! 
} 

aşağıdaki Ve AppDelegate i uygulamasını tekrar ön plan girdiğinde

func applicationWillEnterForeground(application: UIApplication!) { 
    let viewController = self.window!.rootViewController; 
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

    var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("FirstView") as FirstViewController 
    setViewController.execute = true; 


} 

yüzden yapmak istiyorsunuz, ne ben yürütmek değişken ve kaçak bakmak istiyorum edilir yöntemini sahip olarak i web görünümüne gelen javascript tetiklemek için mantık için kod koymak gerektiği gibi takip yöntemi,

if execute{ 
tasksView.stringByEvaluatingJavaScriptFromString("document.getElementById('sample').click()"); 
} 

? viewDidLoad yönteminde mi yoksa webView temsilci yöntemlerinden mi? Bu kodu viewDidLoad yöntemine koymaya çalıştım ancak boolean yürütmesinin değeri, uygulama önalana girdiğinde temsilci içinde ayarlanan değer değil, başlangıç ​​değerine ayarlanır.

+0

Bu yüzden gerçekten neyi istediğimi ve sorunu nasıl çözdüğümü, okuduğum bir yazı hakkında bir blog yazısı yazdım. http://captaindanko.blogspot.com.au/2014/12/knowing-which-notification-brought-my.html – cptdanko

cevap

32

ben uygulama ön planda geri getirildiğinde bir görünüm denetleyicisi bildirilmesini istiyorsanız, sadece (tamamen uygulama temsilci yöntemi atlayarak) .UIApplicationWillEnterForeground bildirimi için kayıt olabilir:

class ViewController: UIViewController { 

    private var notification: NSObjectProtocol? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     notification = NotificationCenter.default.addObserver(forName: .UIApplicationWillEnterForeground, object: nil, queue: .main) { 
      [unowned self] notification in 

      // do whatever you want when the app is brought back to the foreground 
     } 
    } 

    deinit { 
     // make sure to remove the observer when this view controller is dismissed/deallocated 

     if let notification = notification { 
      NotificationCenter.default.removeObserver(notification) 
     } 
    } 
} 

Not, içinde tamamlanma kapaması,(eğer bir sınıf değişkeni güncellemek için gidecekseniz yapmanız gerekir) bloğunun içinde self referansı olması durumunda görüntü denetleyicinin ayrılmasının önlenmesini sağlayan güçlü referans döngüsünden kaçınmak için [unowned self]'u dahil ederim pratikte ilginç bir şey).

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground(_:)), name: .UIApplicationWillEnterForeground, object: nil) 

    } 

    func willEnterForeground(_ notification: NSNotification!) { 
     // do whatever you want when the app is brought back to the foreground 
    } 

    deinit { 
     // make sure to remove the observer when this view controller is dismissed/deallocated 

     NotificationCenter.default.removeObserver(self) 
    } 
} 
+0

Yanıttaki ayrıntıları takdir ediyorum. Şimdi tahmin edebileceğiniz gibi, ios programlamasında çok yeni ve uygulama mağazasında yayınlama konusunda tecrübem yok. Bu nedenle, uygulama için bildirim temsilcisi yöntemini atlarsam, uygulama mağazamın onay onay sürecini temizlemeyen uygulamamın şansını artırır mı? – cptdanko

+2

Hayır, bu bildirim belgelendirilmiş, iyi kurulmuş bir ortak arabirimdir, bu nedenle onaylanmış bir mekanizmadır. Bu iyi. – Rob

+0

Birden fazla gözlemci kaydettiyseniz ve hepsinin deinit üzerinde kaldırılmasını istiyorsanız ne olur? – confile

-1

Swift 3, bu değiştirir ve aşağıdakileri oluşturur: Eğer blok tabanlı bildirim kullanmak istemiyorsanız

Alternatif olarak, eski seçici tabanlı yaklaşımı kullanabilirsiniz.

override func viewDidLoad() { 
     super.viewDidLoad() 

     foregroundNotification = NotificationCenter.default.addObserver(forName: 
     NSNotification.Name.UIApplicationWillEnterForeground, object: nil, queue: OperationQueue.main) { 
      [unowned self] notification in 

     // do whatever you want when the app is brought back to the foreground 
    } 
İlgili konular