Swift WebKitView внутри UITableViewCell - Cell перезагружает представление webkit каждый раз, когда оно появляется на экране - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь загрузить WebKitView внутри UITableViewCell. Хотя ячейка повторяется, я всегда загружаю только одну ячейку этого типа. WebKitView загружает встроенный URL-адрес видео на YouTube.

Итак, в настоящее время код работает, но есть проблема, которая заставляет меня второй раз угадать мой код и задаться вопросом, есть ли что-то, что я пропускаю.

Поведение выглядит следующим образом: 1. Таблица загружает все ячейки правильно, без проблем 2. Ячейка, содержащая веб-набор, загружается правильно, а встроенная ссылка на YouTube загружается в ячейку. Видео может воспроизводиться / воспроизводиться в полноэкранном режиме и работает нормально.

Вот где начинается проблема: 3. Когда я прокручиваю вверх и вниз ячейки таблицы, каждый раз, когда видеоэлемент появляется на экране, наблюдается значительный скачок задержки, и я могу сказать, что ячейка перезагружается, поскольку внутри cellForRowAt есть оператор print, который печатает каждый время. 4. Ошибка выдается вместе с оператором печати. Ошибка выглядит следующим образом:

2018-05-17 08:46:07.305058-0500 Storefront[15267:9513857] WF: 
_WebFilterIsActive returning: NO
2018-05-17 08:46:08.817680-0500 Storefront[15267:9513857] WF: 
_userSettingsForUser mobile: {
filterBlacklist =     (
);
filterWhitelist =     (
);
restrictWeb = 1;
useContentFilter = 0;
useContentFilterOverrides = 0;
whitelistEnabled = 0;
}

Я провел определенное исследование этой ошибки, и, как я понял, она вызвана безопасным URL-адресом, на который я указал загрузку небезопасного контента. Это URL-адрес YouTube, так что это очень странно.

Я попытался добавить youtube.com в мои NSExceptionDomains внутри моего списка, без изменений. Однако, исходя из моих исследований, я не уверен, что распечатанная ошибка связана с задержкой, с которой я сталкиваюсь, и перезагрузкой webkitview каждый раз, когда оно появляется на экране. Это должно быть как-то связано с тем, как использование многократно используемой ячейки, содержащей webkitview, взаимодействует с загрузкой ячейки.

Вот мой код cellForRow:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if product.productHasVideo == true {
        let cell = tableView.deque(VideoTableViewCell.self, configureFrom: self.product, at: indexPath)
        if let id = product.embededYoutubeVideoId {
            print("has id")
            if let url = URL(string: "https://www.youtube.com/embed/\(id)") {
                let urlRequest = URLRequest(url: url)
                cell.videoWebKitView.load(urlRequest)
            }
        } else {
            print("no id")
        }
        return cell
    } else {
        return UITableViewCell()
    }
}

}

Есть мысли или идеи? Спасибо.

EDIT: Я подумал, чтобы попытаться удалить весь раздел загрузки URL из кода и просто загрузить представление webkit. Это было успешно. Ячейка загрузила webkitview, но никогда не загружала URL. Я все еще получал ту же ошибку, что указана выше, и ту же задержку, что и выше, поэтому проблема определенно не имеет ничего общего с моим plist или youtube или указанным мной URL.

Вот код внутри таблицы ViewCell:

import UIKit
import WebKit

class VideoTableViewCell: UITableViewCell, ViewModelConfigurable {

typealias ViewModelType = ProductViewModel

var viewModel: ViewModelType?
@IBOutlet var videoWebKitView: WKWebView!

func configureFrom(_ viewModel: ViewModelType) {
    self.viewModel = viewModel


}

override func awakeFromNib() {
    super.awakeFromNib()

}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

1 Ответ

0 голосов
/ 17 мая 2018

Реализация UITableView делает ячейки многократно используемыми, она не всегда держит все ячейки, она определяет, сколько она поместится на экране +/- некоторый буфер. При прокрутке происходит повторное использование ячеек табличного представления -> происходит перезагрузка.

Вы можете использовать только UIScrollView для создания пользовательских представлений, а затем вам решать, когда вы хотите уничтожить / повторно использовать / удалить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...