【问题标题】:Enabling 3D Touch preview for TableView为 TableView 启用 3D 触摸预览
【发布时间】:2025-11-28 23:50:02
【问题描述】:

我有 TableViewControllerUIViewController 连接,WKWebView 所在的位置。每个 TableView 单元格都指向特定的本地 html 文件,然后将其加载到 WebView 中。

我可以简单地在 Attributes Inspector 中检查 Peek & Pop - Preview & Commit Segues 以了解该 segue,但 预览将始终显示相同的 html 文件,而不是不同的每个选定的表格单元格对应一个。

实现 3D Touch 的正确方法是什么,或者如何以某种方式准备 html 内容以在第一个 TableViewController 中进行预览?


.xcodeproj 在我的 github 上。按需提供更多信息。

感谢您的帮助!

【问题讨论】:

    标签: swift uitableview wkwebview 3dtouch


    【解决方案1】:

    好的,我看到了你的代码,但你没有实现 3D Touch,首先你需要检查你的 viewDidLoad() 方法中是否有 3DTouch:

    if( UIApplication.shared.keyWindow?.traitCollection.forceTouchCapability == .available{
    registerForPreviewing(with: self, sourceView: view)
    }
    

    然后,实现Preview UIViewControllerPreviewingDelegate的delegate,你说的是用3dtouch弹出一个viewcontroller,在delegate中实现这个功能

    extension:YourViewController:UIViewControllerPreviewingDelegate{
    
       func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
           //Here's where you commit (pop)
           //You are trying to show into tableview, the next code makes this
           //For TableView
          guard let indexPath = tableView?.indexPathForItem(at:location) else { 
          return nil }
          guard  let cell2 = tableview.cellForRow(at: indexPath) else { return nil }
          guard let popVC = storyboard?.instantiateViewController(withIdentifier: "popVC") as? YourClassViewControllerToShow else { return nil }
         let html = htmls[indexPath.row]
         popVC.html = html
         show(popVC, sender: self)
    
       } 
    }
    

    然后我将代码从 Detail.swift viewDidLoads() 切换到 viewWillAppear()

    content.uiDelegate = self
      content.navigationDelegate = self
      let url = Bundle.main.url(forResource: result?.id, withExtension: "html", subdirectory: "Library")!
      let request = URLRequest(url: url)
      content.loadFileURL(url, allowingReadAccessTo: url)
      content.load(request)
    

    使用最后一个,您可以确保 web 视图在出现时始终刷新。

    【讨论】:

    • 谢谢 :) 如果这对你有用,你能否向我的 GitHub 提出拉取请求,也许?因为我错过了一些东西..
    • 对不起老兄,我没有 Xcode 10,但你可以尝试在 Library.swift 中更改有关 UIViewControllerPreviewingDelegate 的更改,并在 Detail.swift 中更改有关 viewdidload - viewwillappear webView!
    • 我理解你的回答,但给了我很多不同的错误,假设我按预期做了。我将第一个代码放在 firstViewController 的 viewDidLoad();在 extensions.swift 中排名第二,在 detail.swift 的 viewWillAppear 中排名第三...
    • 扩展在 library.swift 扩展库中: UIViewControllerPreviewingDelegate{ . //在函数previewcontext }里面,放上结束类的按钮
    【解决方案2】:

    查看时没有选定的单元格,因此您不能只向表格询问选定的单元格。相反,您必须处理sender 参数,即UITableViewCell

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "transporter" {
            guard
                let cell = sender as? UITableViewCell,
                let path = table.indexPath(for: cell)
            else {
                return
            }
    
            let selected = filtering() ? filter[path.section].rows[path.row] : list[path.section].rows[path.row]
            let controller = (segue.destination as! Detail)
            controller.result = selected
        }
    }
    

    【讨论】:

    • 我现在很喜欢,半小时后试试,谢谢! :)
    • 20 小时内可获得赏金。
    最近更新 更多