【问题标题】:Swift 3. Can present a UIViewController with UIWebViewDelegate but not push itSwift 3. 可以使用 UIWebViewDelegate 呈现 UIViewController 但不能推送它
【发布时间】:2017-03-25 18:31:54
【问题描述】:

我有一个UIViewControllerUIWebViewDelegate。我发现我可以很好地呈现它,但不能推动它。如果我尝试推送它,目标视图控制器会加载并执行任何变量集,但不会触发 viewDidLoad(),而是返回到我的调用菜单视图控制器而不会出错。

我在类之后的第一个 var 声明上设置了一个断点,并单步执行了代码。当它到达 webView init 时,它会在模拟器中闪现主(非目标)视图控制器,然后继续通过 var 声明,然后返回我的主视图控制器。

这是我的菜单代码

作品:

let myWebViewController = MyWebViewController()

myWebViewController.urlString = "myUrl"

present(myWebViewController, animated: true, completion: nil)

没用

let myWebViewController = MyWebViewController()

myWebViewController.urlString = "myUrl"

let navController = (UIApplication.shared.delegate as! AppDelegate).navController

navController!.pushViewController(myWebViewController, animated: true)

这是我编辑的目标视图控制器代码。要加载的 URL 在菜单中设置。

import UIKit

class MyWebViewController: UIViewController, UIWebViewDelegate {

var urlString: String = "invalid url"

var url: URL {
    return URL(string: urlString)!
}

var urlRequest: URLRequest {

    var urlRequest = URLRequest(url: url)

    return urlRequest
}

let webView: UIWebView = {
    let view = UIWebView()
    view.backgroundColor = .white
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

// declare various buttons and stack views 

override func viewDidLoad() {
    super.viewDidLoad()

    webView.delegate = self

    contentStackView.addArrangedSubview(webView)

    mainStackView.addArrangedSubview(contentStackView)

    view.addSubview(mainStackView)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    webView.loadRequest(urlRequest as URLRequest)
}

【问题讨论】:

  • 你能显示更多代码吗? present(myWebViewController... is or navController!.pushViewController is 或 navController!.pushViewController 是没有意义的,如果你不显示你从哪里得到变量 myWebViewController - 我怀疑那里的某个地方,在你没有显示的代码中,是 exactly 问题的根源。 — 另外,请返回所有代码并让所有类都以大写字母开头。所以这将是一个变量myWebViewController,其类型为MyWebViewController
  • 小写的类名在这里只是一个错字。我已更新我的问题以添加更多代码。
  • 由于目标视图开始加载,我认为菜单代码不是问题,但这可能是错误的。
  • 我不明白问题是什么,也不明白你的代码应该如何工作。您的 MyWebViewController 不包含实际将 UIWebView 放入界面、获取 URL 或任何有用的代码。
  • 添加了更多代码。呈现目标视图控制器效果很好。

标签: uiviewcontroller swift3 uiwebviewdelegate


【解决方案1】:

这个问题与 Web 视图、Web 视图控制器或其他任何东西无关,除了你在哪里推动视图控制器。你是说:

let navController = (UIApplication.shared.delegate as! AppDelegate).navController
navController!.pushViewController(myWebViewController, animated: true)

这是非常不寻常的。通常的情况是我们已经在导航界面中,并且我们推入它的堆栈:

let navController = self.navigationController
navController!.pushViewController(myWebViewController, animated: true)

但你不是这么说的。为什么不?我猜这是因为self 没有拥有 navigationController。所以你成功地推到了导航控制器上,好吧,但是你没有看到任何事情发生,因为导航控制器在幕后——self 视图控制器的视图正在阻止它或已替换它。

这就解释了为什么您从未检测到 url 加载。您拨打webView.loadRequest 的电话是viewWillAppear。但是这个视图不会出现;它在幕后。 viewWillAppear 永远不会被调用。同样viewDidLoad 也不会被调用,因为这个视图不会加载;导航控制器没有占用界面——self 是。

【讨论】:

  • 我知道调用视图控制器没有导航控制器,但是如何使用根导航控制器将其置于最前面?感谢您对viewWillAppear() 的额外见解viewDidLoad() 中的断点表明它也从未被触发。
  • 取出对应用委托导航控制器的调用会由于 nil 而导致崩溃。侧边菜单没有导航控制器,除非我将其隐藏起来,否则我看不出它是怎么做到的。
  • "调用应用代理导航控制器会因为 nil 导致崩溃" 正确,因为self 没有导航控制器,正如我所说。
  • 我对你的“侧边菜单”一无所知,因为你什么也没说。你的问题没有提到!但重点是self,不管它是什么,都在占用界面。你不会得到任何对viewDidLoadviewDidAppear 的调用,直到你得到self 并让导航控制器占据界面。在尝试推送之前,您需要以某种方式首先dismiss self
【解决方案2】:

我可能会想到为什么 webViewController 没有被推送的一种情况。

您尝试从中进行推送的 UIViewController 可能不是导航控制器层次结构的一部分。

你为什么不尝试使用代码而不是从 AppDelegate 获取 navController

self.navigationController?.pushViewController(myWebViewController, animated: true)

如果这不起作用,那么你肯定做错了什么。

【讨论】:

  • 这会崩溃。我知道 UITableView 菜单没有导航控制器。问题是如何让视图加载?
  • 让你的tableviewcontroller作为UINavigationController的rootviewcontroller,它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多