我正在使用新语言Swift构建iOS应用。现在,它是一个HTML5应用程序,它使用UIWebView显示HTML内容。该应用程序具有本地通知,我想做的是,当该应用程序通过单击(触摸)本地通知进入前台时,会在UIWebView中触发特定的javascript方法。
我已经看过这个问题,但似乎并不能解决我的问题。我也遇到了这个问题,它告诉我有关使用UIApplicationState的信息,这很好,因为这可以帮助我知道应用程序从通知进入前台。但是,当应用恢复时,如何在应用恢复时显示的视图的viewController中调用方法?
我想做的是获取ViewController的实例并将其属性设置为true。如下
class FirstViewController: UIViewController,UIWebViewDelegate { var execute:Bool = false; @IBOutlet var tasksView: UIWebView! }
在我的AppDelegate中,我有方法
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; }
所以我想做的是当应用再次进入前台时,我想查看一下execute变量并按如下方式运行方法,
if execute{ tasksView.stringByEvaluatingJavaScriptFromString("document.getElementById('sample').click()"); }
我应该在哪里放置逻辑代码,以从Webview触发javascript?它是在viewDidLoad方法上还是webView委托方法之一上?我试图将代码放入viewDidLoad方法中,但布尔执行的值设置为其初始值,而不是应用程序进入前台时在委托中设置的值。
如果我希望在应用程序回到前台时通知视图控制器,我可以只注册该UIApplication.willEnterForegroundNotification通知(完全绕过应用程序委托方法):
UIApplication.willEnterForegroundNotification
class ViewController: UIViewController { private var observer: NSObjectProtocol? override func viewDidLoad() { super.viewDidLoad() observer = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main) { [unowned self] notification in // do whatever you want when the app is brought back to the foreground } } deinit { if let observer = observer { NotificationCenter.default.removeObserver(observer) } } }
注意,在完成封闭中,我包括[unowned self]避免强引用周期,以防止在碰巧self在块内引用时释放视图控制器的情况(如果要更新类变量或更新类变量,可能需要这样做)做几乎所有有趣的事情)。
[unowned self]
self
还要注意,即使随意阅读removeObserver 文档可能导致不必得出结论,我也会删除观察者:
removeObserver
如果您的应用程序针对iOS 9.0和更高版本或macOS 10.11和更高版本,则无需在其dealloc方法中注销观察者。
但是,当使用此基于块的表示形式时,您确实确实需要删除通知中心观察者。至于文件的addObserver(forName:object:queue:using:)说:
addObserver(forName:object:queue:using:)
要取消注册观察值,请将此方法返回的对象传递给removeObserver(_:)。您必须调用removeObserver(_:)或,removeObserver(_:name:object:)然后再addObserver(forName:object:queue:using:)释放由其指定的任何对象。
removeObserver(_:)
removeObserver(_:name:object:)