我试图在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
}
}
答案 0 :(得分:1)
UITableView
的实现使得单元格可以重复使用,它不会始终保留所有单元格,它会在屏幕上显示多少单元格+/-某个缓冲区。滚动时,它会使表视图重用单元格 - >重装正在发生。
您可以仅使用UIScrollView
来实例化自定义视图,然后在您想要销毁/重复使用/删除它们时由您自己决定。