您好,如果有人可以帮助我,谢谢!
我有两个viewcontrollers HomeController
和TableController
在HomeController中,我得到了一个webview,当我转到TableController并调用一个函数来加载另一个webview请求时。 webview返回nil。
HomeController是应用程序的主屏幕,它是一个webview。 TableController是应用程序左侧汉堡菜单中的表格。当我打开它并单击某个项目时,我想获取该项目的URL并使用该URL发送具有相同HomeController的请求。但是当我到达connectUrl()
时,我得到一个致命的错误,这是因为webView是零。
编辑:在下面回答
以下代码:
TableController
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!)
}
的HomeController
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)
}}
答案 0 :(得分:0)
控制台中是否有域erron?/ 如果是的话
将其添加到plist。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
答案 1 :(得分:0)
我在试验和错误之后找到了解决方案,包括许多开发选项,如delegates,segue,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
我添加了一个Observer来接收通知并解压缩字典,以获取网址。
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)
}
答案 2 :(得分:0)
这不是WKWebView
相关问题。这里的实际问题是您不知道如何从视图控制器返回数据。
最基本的解决方案是代表。首先,创建一个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)
}
}
现在,当您从TableController
展示HomeController
时,您只需配置其代理人:
func displayTableController() {
let tableController = storyboard?.instantiateViewControllerWithIdentifier("tableController") as! TableControllerController
tableController.delegate = self
}
更多代码,但这是iOS中非常常见的模式。