为TableView启用3D Touch预览

时间:2018-08-11 22:00:51

标签: swift uitableview wkwebview 3dtouch

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

  

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

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


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

感谢帮助!

2 个答案:

答案 0 :(得分:1)

好吧,我看到了您的代码,您没有实现3D触摸,首先需要检查您的viewDidLoad()方法中3DTouch是否可用:

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

然后,实现Preview UIViewControllerPreviewingDelegate的委托,您正在谈论使用3dtouch弹出视图控制器,在委托中实现此功能

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视图始终在出现时刷新。

答案 1 :(得分:0)

偷看时没有选定的单元格,因此您不能只问表格有关选定单元格的信息。相反,您必须处理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
    }
}