【发布时间】:2021-08-15 16:31:33
【问题描述】:
DetailCollectionViewCell 包含一个 WKWebView,用于加载从服务器嵌入的特定视频和文本。我的目标是当用户点击后退按钮时,视频应该停止。我尝试重新加载或将 WebView 的 URL 设置为 nil,但每次尝试影响 detailWebView 时,我都会收到致命错误和 Web View 的 nil 值。
.
├── _PageViewController.swift
│ └── viewWillDisappear()
├── _DetailCollectionViewCell.swift (File Owner of the nib)
└── └── WKWebView: detailWebView
DetailCollectionViewCell.swift(我在其中为 WebView 填充数据。)
@objc protocol DetailCollectionViewCellDelegate {
func reload()
@objc func scrollAuthorAllColumns()
}
class DetailCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var detailWeb: WKWebView!
var delegate: DetailCollectionViewCell?
override func awakeFromNib() {
super.awakeFromNib()
detailWeb.navigationDelegate = self
detailWeb.uiDelegate = self;
detailWeb.autoresizingMask = UIView.AutoresizingMask(rawValue: UIView.AutoresizingMask.flexibleWidth.rawValue | UIView.AutoresizingMask.flexibleHeight.rawValue)
}
var itemAuthor: Column? {
didSet {
if let column = itemAuthor {
if(PageViewController.itemId != column.itemId) {
let webViewHeight = 50 as CGFloat
self.webViewHeight.constant = webViewHeight
self.wKWebViewHeight.constant = webViewHeight
self.detailWeb.frame.size.height = webViewHeight
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
if(PageViewController.webViewHg <= Int(webViewHeight)) {
HUD.show(HUDContentType.progress)
}
}
self.detailWeb.isHidden = true
self.delegate?.reload()
let HTMLString = "my HTML string"
detailWeb.loadHTMLString(String(HTMLString), baseURL: URL.init(fileURLWithPath: Bundle.main.bundlePath))
}
}
}
}
}
PageViewController.swift
override func viewWillDisappear(_ animated: Bool) {
DetailCollectionViewCell.detailWeb.reload() "<--------- Crashes here. detailWebView = nil"
"Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value"
}
extension PageViewController: DetailCollectionViewCellDelegate {
func reload() {
DispatchQueue.main.async{
self.collectionView.collectionViewLayout.invalidateLayout()
}
}
func scrollAuthorAllColumns() {
collectionView.scrollToItem(at: IndexPath.init(row: 0, section: 1), at: .top, animated: true)
}
【问题讨论】:
-
DetailViewCell不是UITableViewCell或UICollectionView内的UITableView/UICollectionView,我希望。否则,PageViewController中的DetailViewCell是什么?它在哪里定义?您可以强制加载:DetailViewCell.loadIfNeeded(); DetailsViewCell.detailsWeb.reload()但我想知道是否也没有实例问题。 -
当我在
viewWillDisappear中使用DetailViewCell.loadIfNeeded()时,我得到Type 'DetailViewCell' has no member 'loadIfNeeded'。 DetailViewCell 是一个 nib 自定义视图,而不是 UITableViewCell 等。我也认为这是一个实例问题,但我不知道如何解决它。如果这是一个 View Cell -> View Controller 案例,我会使用委托传递数据,但这是一个 View Controller -> View Cell 案例。 -
DetailViewCell的超类是什么?它是如何初始化的?它在PageViewController中定义在哪里我的意思是loadViewIfNeeded()以防它是一个 UIViewController,但我们不知道它的类型,因为你没有给它。 -
DetailViewCell是一个UICollectionViewCell,它没有在PageViewController中定义。这就是为什么我将文件层次结构放在问题的开头。我总共有 3 个文件;PageViewController.swift、DetailViewCell.swift、DetailViewCell.xib。我用collectionView.register(UINib(nibName: "DetailViewCell", bundle: nil), forCellWithReuseIdentifier: "DetailViewCell")在PageViewController上的viewDidLoad中注册了笔尖DetailViewCell,并在PageViewController.swift中定义的CollectionView中显示它 -
DetailViewCell 的委托从何而来?
标签: ios swift uiview wkwebview xib