在Xcode外部运行应用程序时,为什么不调用viewDidLoad?

时间:2019-06-26 20:39:49

标签: swift macos viewdidload

我有一个编辑器窗口,可以使用segue打开预览窗口,因此您可以同时查看它们。当我从Xcode运行该应用程序时,它的运行完全符合预期,并且在此新窗口的NSViewController上调用了viewDidLoad。

但是当我直接运行内置产品(应用程序)时,双击该应用程序,然后从编辑器窗口中打开预览窗口,它崩溃了,因为代码试图访问似乎不存在的内容被设置(无)。

嵌入式NSLogs到控制台显示,直接运行该应用程序时,从未调用过viewDidLoad。从Xcode运行时,确实会出现这些日志,这就是为什么。

为什么在运行应用程序本身时会得到不同的结果?当我删除一些实际导致崩溃的代码时,我得到了窗口,但是没有任何视图。只是黑色,因为它们从未被创建,这就是为什么从未调用过viewDidLoad的原因。

为什么会这样?

所以我的实际问题是:以前有人见过这种行为吗?我已经在互联网上进行搜索,但是没有发现有人看到相同的情况。

我正在考虑从具有提示的单个故事板切换到新窗口,再从单独的xib加载窗口。

男孩,它使调试变得困难。怪异的苹果。

更新:好的,我发现当您将WKWebView嵌入到NSScrollView中时,似乎会发生此问题—使用应用程序本身时发生崩溃,但当我从Xcode运行它时却没有发生崩溃。在那种情况下,如果我想保持这种布局,则可以以编程方式添加WKWebView的实例作为scrollView.documentView的子视图,或者替换documentView本身。

但是UI设计的变化导致我将WKWebView直接放在情节提要中(而不是在NSScrollView内部),并且可以正常工作而不会崩溃(称为viewDidLoad)。

否!再次测试,即使使用了Storyboard(未调用viewDidLoad)添加WKWebView时,它仍然崩溃,即使它不再嵌入NSScrollView中也是如此。切换为以编程方式将WKWebView作为子视图添加到窗口的viewController中,现在可以正常工作了。因此,也许避免通过IB添加WKWebViews。至少使用Xcode 10.2和MacOS Mojave。

Apple确实在其文档中说过,不应将WKWebView嵌入NSScrollView内,因为这样可能会导致“意外行为,恶心,呕吐,内部出血,视力丧失”。而未调用viewDidLoad则是意外的。

此外,还可以通过使用JavaScript调用来设置webView中滚动位置的设置。如果有人正在寻找解决方案,请参见以下代码:

class PreviewViewController: NSViewController, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!
    var scrollPosition = 0

    func loadHTML() {

        if let filepath = Bundle.main.path(forResource: "master", ofType: "html") {
            do {

                webView.evaluateJavaScript("window.pageYOffset;", completionHandler: { (result, error ) in
                    self.scrollPosition = (result as? Int)!
                })
                var html = try String(contentsOfFile: filepath)

                // do some string replacements
                // html = html.replacingOccurrences(of: "stringInHtmlFile", with: "replacementStr")

                webView.loadHTMLString(html, baseURL: nil)

            } catch {
                // contents could not be loaded
            }
        } else {
            // example.txt not found!
        }

    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("window.scrollTo(0, \(scrollPosition));")
    }

即使长时间替换字符串,也会在window.pageYOffset;之前到达loadHTMLString;返回一个答案,这就是为什么将该值存储为全局值的原因。在HTML完成加载后调用func webView时,可以在更新时将视图重置为滚动位置,因此预览不会一直翻转回顶部。

可能是竞争情况,但更糟糕的是,页面仅返回顶部。稍后再处理。现在,似乎在单独的编辑器窗口中实时更新WebView时,它仍保持滚动位置。

所有问题都解决了!

0 个答案:

没有答案