UITableViewCell中的Swift WebKitView - 每次进入屏幕时,Cell都会重新加载webkit视图

时间:2018-05-17 14:09:00

标签: ios swift uitableview webkit

我试图在UITableViewCell中加载WebKitView。虽然单元格正在重复,但我总是只加载一个这种类型的单元格。 WebKitView加载嵌入的YouTube视频网址。

目前,代码正在运行,但是有一个问题导致我再次猜测我的代码,并想知道是否有一些我遗漏的东西。

行为如下: 1.该表正确加载所有单元格,没有任何问题 2.包含Web工具包视图的单元格正确加载,嵌入的YouTube视频链接在单元格中正确加载。该视频可以播放/全屏播放,似乎工作得很好。

问题在哪里开始: 3.当我在表格单元格中上下滚动时,每次视频单元出现在屏幕上时,都会出现明显的滞后峰值,我可以告诉单元格被重新加载,因为在cellForRowAt中有一个打印语句正在打印每个时间。 4.与print语句一起产生错误。错误如下:

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引起了我的收集。这是一个youtube网址,所以这很奇怪。

我尝试将youtube.com添加到我的plist中的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()
    }
}

}

任何想法或想法?感谢。

编辑: 我想尝试从代码中删除整个url加载部分,只需加载webkit视图。这很成功。该单元格加载了webkitview,但从未加载过URL。我仍然收到上面列出的相同错误,以及上面列出的相同延迟,因此问题肯定与我的plist或youtube或我指定的URL无关。

这是tableViewCell中的代码:

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 :(得分:1)

UITableView的实现使得单元格可以重复使用,它不会始终保留所有单元格,它会在屏幕上显示多少单元格+/-某个缓冲区。滚动时,它会使表视图重用单元格 - >重装正在发生。

您可以仅使用UIScrollView来实例化自定义视图,然后在您想要销毁/重复使用/删除它们时由您自己决定。