从另一个控制器

时间:2015-09-29 10:48:04

标签: ios swift webview wkwebview

您好,如果有人可以帮助我,谢谢! 我有两个viewcontrollers HomeControllerTableController 在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)

}}

3 个答案:

答案 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传递回任何打开它的视图。

请注意,TableControllerHomeController之间没有直接关系。这是一个很好的做法。

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中非常常见的模式。