У меня есть окно редактора, которое открывает окно предварительного просмотра, используя переход, так что вы можете смотреть на них обоих бок о бок.Когда я запускаю приложение из 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 сохраняет свою позицию прокрутки при обновлении в реальном времени в отдельном окне редактора.
Все проблемы решены!