从另一个控制器调用函数后,webview 变为 nil
webview turns nil after calling function from another controller
您好,如果有人可以帮助我,谢谢!
我有两个视图控制器 HomeController
和 TableController
在 HomeController 中,我有一个 webview,当我转到 TableController 并调用一个函数来加载另一个对 webview 的请求时。网络视图 returns 无。
HomeController 是应用程序的主屏幕,它是一个 webview。 TableController 是应用程序左侧汉堡包菜单中的 table。当我打开它并单击一个项目时,我想获取该项目的 url 并使用该 url 发送具有相同 HomeController 的请求。但是在我到达 connectUrl()
的那一刻,我得到了一个致命错误,这是因为 webView 是零。
编辑:在下方回答
代码如下:
表控制器
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var HomeViewController: HomeController {
return self.storyboard?.instantiateViewControllerWithIdentifier("homeController") as! HomeController
}
let url = self.item[indexPath.item].url
HomeViewController.connectUrl(url!)
}
家庭控制器
class HomeController: UIViewController{
static let sharedInstance = HomeController()
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
webView = WKWebView(frame: view.bounds, configuration: configuration)
self.view.addSubview(self.webView)
}
func connectUrl(url: String){
let url2 = NSURL(string: url)
let req = NSURLRequest(URL: url2!)
print(req)
self.webView!.loadRequest(req)
}}
控制台是否有域错误?/如果是
将其添加到 plist。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
经过反复试验,我找到了解决方案,其中包含许多开发选项,例如委托、转场、instantiateViewController 等。
最后 NSNotificationCenter 是我的解决方案。
我在我的 TableController
中创建了这个函数来向 HomeController
发送通知以调用 ConnectUrl。
func sendData(url: String){
self.dismissViewControllerAnimated(true, completion: nil)
let itemDictionary = ["itemUrl": url]
NSNotificationCenter.defaultCenter().postNotificationName("connectUrl", object: nil, userInfo: itemDictionary)
}
}
}
在HomeController
中我添加了一个观察者来接收通知并解压收到的字典得到url.
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView(frame: view.bounds, configuration: configuration)
self.view.addSubview(self.webView!)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "connectUrl:", name: "connectUrl", object: nil)
}
func connectWithSpecifiedItem(notification: NSNotification){
let itemUrl = notification.userInfo!["itemUrl"] as! String
let url2 = NSURL(string: itemUrl)
let req = NSURLRequest(URL: url2!)
self.webView!.loadRequest(req)
}
这不是 WKWebView
相关的问题。这里的实际问题是您不知道如何 return 来自视图控制器的数据。
对此最基本的解决方案是委托。首先,创建一个 TableControllerDelegate
.
protocol TableControllerDelegate {
func tableController(tableController: TableController, didSelectItemWithURL: NSURL)
}
然后你在你的 HomeController
:
中实现它
class HomeController: UIViewController, TableControllerDelegate {
func tableController(tableController: TableController, didSelectItemWithURL url: NSURL) {
webView.loadRequest(NSURLRequest(URL: url))
}
}
在您的 TableController
中,事情变得更简单,联系更少。你让它有一个 TableControllerDelegate 字段并简单地调用它以将所选项目 URL 返回到打开它的任何视图。
请注意,TableController
和 HomeController
之间不再存在直接关系。这是一个很好的做法。
class TableController: UITableViewController {
weak delegate: TableControllerDelegate?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let url = self.item[indexPath.item].url
delegate?.tableController(self, didSelectItemWithURL: url)
}
}
现在,当您从 HomeController
中展示您的 TableController
时,您只需配置其委托:
func displayTableController() {
let tableController = storyboard?.instantiateViewControllerWithIdentifier("tableController") as! TableControllerController
tableController.delegate = self
}
更多代码,但这是 iOS 中非常常见的模式。
您好,如果有人可以帮助我,谢谢!
我有两个视图控制器 HomeController
和 TableController
在 HomeController 中,我有一个 webview,当我转到 TableController 并调用一个函数来加载另一个对 webview 的请求时。网络视图 returns 无。
HomeController 是应用程序的主屏幕,它是一个 webview。 TableController 是应用程序左侧汉堡包菜单中的 table。当我打开它并单击一个项目时,我想获取该项目的 url 并使用该 url 发送具有相同 HomeController 的请求。但是在我到达 connectUrl()
的那一刻,我得到了一个致命错误,这是因为 webView 是零。
编辑:在下方回答
代码如下:
表控制器
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var HomeViewController: HomeController {
return self.storyboard?.instantiateViewControllerWithIdentifier("homeController") as! HomeController
}
let url = self.item[indexPath.item].url
HomeViewController.connectUrl(url!)
}
家庭控制器
class HomeController: UIViewController{
static let sharedInstance = HomeController()
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
webView = WKWebView(frame: view.bounds, configuration: configuration)
self.view.addSubview(self.webView)
}
func connectUrl(url: String){
let url2 = NSURL(string: url)
let req = NSURLRequest(URL: url2!)
print(req)
self.webView!.loadRequest(req)
}}
控制台是否有域错误?/如果是
将其添加到 plist。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
经过反复试验,我找到了解决方案,其中包含许多开发选项,例如委托、转场、instantiateViewController 等。
最后 NSNotificationCenter 是我的解决方案。
我在我的 TableController
中创建了这个函数来向 HomeController
发送通知以调用 ConnectUrl。
func sendData(url: String){
self.dismissViewControllerAnimated(true, completion: nil)
let itemDictionary = ["itemUrl": url]
NSNotificationCenter.defaultCenter().postNotificationName("connectUrl", object: nil, userInfo: itemDictionary)
}
}
}
在HomeController
中我添加了一个观察者来接收通知并解压收到的字典得到url.
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView(frame: view.bounds, configuration: configuration)
self.view.addSubview(self.webView!)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "connectUrl:", name: "connectUrl", object: nil)
}
func connectWithSpecifiedItem(notification: NSNotification){
let itemUrl = notification.userInfo!["itemUrl"] as! String
let url2 = NSURL(string: itemUrl)
let req = NSURLRequest(URL: url2!)
self.webView!.loadRequest(req)
}
这不是 WKWebView
相关的问题。这里的实际问题是您不知道如何 return 来自视图控制器的数据。
对此最基本的解决方案是委托。首先,创建一个 TableControllerDelegate
.
protocol TableControllerDelegate {
func tableController(tableController: TableController, didSelectItemWithURL: NSURL)
}
然后你在你的 HomeController
:
class HomeController: UIViewController, TableControllerDelegate {
func tableController(tableController: TableController, didSelectItemWithURL url: NSURL) {
webView.loadRequest(NSURLRequest(URL: url))
}
}
在您的 TableController
中,事情变得更简单,联系更少。你让它有一个 TableControllerDelegate 字段并简单地调用它以将所选项目 URL 返回到打开它的任何视图。
请注意,TableController
和 HomeController
之间不再存在直接关系。这是一个很好的做法。
class TableController: UITableViewController {
weak delegate: TableControllerDelegate?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let url = self.item[indexPath.item].url
delegate?.tableController(self, didSelectItemWithURL: url)
}
}
现在,当您从 HomeController
中展示您的 TableController
时,您只需配置其委托:
func displayTableController() {
let tableController = storyboard?.instantiateViewControllerWithIdentifier("tableController") as! TableControllerController
tableController.delegate = self
}
更多代码,但这是 iOS 中非常常见的模式。