【问题标题】:Swift - How to manipulate outlet in nib while "viewWillDisappear" on ViewController?Swift - 如何在 ViewController 上的“viewWillDisappear”时操作笔尖中的插座?
【发布时间】: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 不是UITableViewCellUICollectionView 内的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.swiftDetailViewCell.swiftDetailViewCell.xib。我用collectionView.register(UINib(nibName: "DetailViewCell", bundle: nil), forCellWithReuseIdentifier: "DetailViewCell")PageViewController上的viewDidLoad中注册了笔尖DetailViewCell,并在PageViewController.swift中定义的CollectionView中显示它
  • DetailViewCell 的委托从何而来?

标签: ios swift uiview wkwebview xib


【解决方案1】:

我已经使用this 方法来实现我的目标。

基本上它的作用是禁用内联播放,只允许 tvPlayer 全屏播放,因此当用户关闭全屏时,视频停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多