Почему viewDidLoad не вызывается при запуске приложения вне XCode? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть окно редактора, которое открывает окно предварительного просмотра, используя переход, так что вы можете смотреть на них обоих бок о бок.Когда я запускаю приложение из Xcode, оно работает точно так, как и ожидалось, при этом viewDidLoad вызывается в NSViewController этого нового окна.

Но когда я запускаю встроенный продукт (приложение) напрямую, дважды щелкнув приложение,и я открываю окно предварительного просмотра из окна редактора, оно вылетает, потому что код пытается получить доступ к чему-то, что, по-видимому, не установлено (nil).

Встроенные NSLogs в консоль показывают мне, что viewDidLoad никогда не бываетвызывается при запуске приложения напрямую.Эти журналы появляются при запуске из Xcode, поэтому все нормально.

Зачем мне получать другой результат при запуске самого приложения?Когда я удаляю фрагмент кода, который на самом деле приводит к сбою, я получаю окно, но ни одно из представлений отсутствует.Это просто черный, потому что они никогда не создавались, поэтому viewDidLoad никогда не вызывался.

Почему это так?

Итак, мой реальный вопрос: кто-нибудь видел такое поведение?до?Я искал в интернете, но не нашел ни одного случая, чтобы кто-то видел то же самое.

Я думаю о переходе от одной раскадровки с переходом к новому окну для загрузки окна из отдельной xib.

Мальчик, затрудняет отладку.Freakin 'Apple.

ОБНОВЛЕНИЕ: Хорошо, я понял, что проблема возникает, когда вы встраиваете WKWebView в NSScrollView - я получаю сбой при использовании самого приложения, но не когдаЯ запускаю его из Xcode.В этом случае, если я хотел сохранить этот макет, я добавил программно экземпляр WKWebView в качестве подпредставления scrollView.documentView или заменил сам documentView.

Но изменение в дизайне пользовательского интерфейса привело меняпоместить WKWebView непосредственно в раскадровку (не внутри NSScrollView), и это работает без сбоев (вызывается viewDidLoad).

Нет! Протестировано снова и все еще падает при добавленииWKWebView с использованием раскадровки (viewDidLoad не вызывается), даже если он больше не встроен в NSScrollView.Переключен на программное добавление WKWebView в качестве подпредставления в viewController окна, и теперь он работает нормально.Так что, возможно, избегайте добавления WKWebViews посредством IB.По крайней мере, с Xcode 10.2 и MacOS Mojave.

Apple в своей документации заявляет, что вам не следует встраивать WKWebView в NSScrollView, поскольку вы можете получить «неожиданное поведение, тошноту, рвоту, внутреннее кровотечение, потерю зрения».«.А то, что viewDidLoad не вызывается, довольно неожиданно.

Также получил настройку позиции прокрутки в webView, работающую с использованием вызовов JavaScript.Вот код, если кто-то ищет решение:

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));")
    }

Даже при большом количестве последовательных замен строк, loadHTMLString будет достигнут до window.pageYOffset;возвращается с ответом, поэтому это значение сохраняется как глобальное.Когда func webView вызывается после того, как HTML-файл завершает загрузку, представление может быть сброшено в положение прокрутки во время обновления, поэтому предварительный просмотр не переворачивается наверх.

Вероятно, состояние гонки, что еще хуже, страница просто возвращается наверх.Я разберусь с этой деталью позже.Сейчас кажется, что webView сохраняет свою позицию прокрутки при обновлении в реальном времени в отдельном окне редактора.

Все проблемы решены!

...