从另一个控制器调用函数后,webview 变为 nil

webview turns nil after calling function from another controller

您好,如果有人可以帮助我,谢谢! 我有两个视图控制器 HomeControllerTableController 在 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 返回到打开它的任何视图。

请注意,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)
    }
}

现在,当您从 HomeController 中展示您的 TableController 时,您只需配置其委托:

func displayTableController() {
    let tableController = storyboard?.instantiateViewControllerWithIdentifier("tableController") as! TableControllerController
    tableController.delegate = self
}

更多代码,但这是 iOS 中非常常见的模式。