Peek & Pop 不会仅在最后一个单元格上触发

Peek & pop does not trigger only on the last cell

我有一个包含列表的 ProfileVC。 我可以单击任何行单元格将显示查看和弹出功能。

ProfileVC.swift

我添加了扩展

extension ProfileViewController : UIViewControllerPreviewingDelegate {
    
    func detailViewController(for indexPath: IndexPath) -> ProfileDetailViewController {
        guard let vc = storyboard?.instantiateViewController(withIdentifier: "ProfileDetailViewController") as? ProfileDetailViewController else {
            fatalError("Couldn't load detail view controller")
        }
        
        let cell = profileTableView.cellForRow(at: indexPath) as! ProfileTableViewCell
        
        // Pass over a reference to the next VC
        vc.title   = cell.profileName?.text
        vc.cpe     = loginAccount.cpe
        vc.profile = loginAccount.cpeProfiles[indexPath.row - 1]
        
        consoleLog(indexPath.row - 1)
        
        //print("3D Touch Detected !!!",vc)
        
        return vc
    }
    
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        if let indexPath = profileTableView.indexPathForRow(at: location) {
            
            // Enable blurring of other UI elements, and a zoom in animation while peeking.
            previewingContext.sourceRect = profileTableView.rectForRow(at: indexPath)
            
            return detailViewController(for: indexPath)
        }
        
        return nil
    }
    
    //ViewControllerToCommit
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        
        // Push the configured view controller onto the navigation stack.
        navigationController?.pushViewController(viewControllerToCommit, animated: true)
    }
    
}

然后,在同一个文件ProfileVC.swiftviewDidLoad()我注册了它

if (self.traitCollection.forceTouchCapability == .available){
    print("-------->", "Force Touch is Available")
    registerForPreviewing(with: self, sourceView: view)
}
else{
    print("-------->", "Force Touch is NOT Available")
}

结果

我不知道为什么我不能点击 4th 单元格。

该行的 最后一个 单元格不会触发 Peek & Pop。

如何进一步调试它?

您正在将视图控制器的根 view 注册为 peek 上下文的源视图。结果,传递给 previewingContext(_ viewControllerForLocation:)` 的 CGPoint 位于该视图的坐标 space 中。

当您尝试从 table 视图中检索相应的行时,该点实际上会根据相对位置从 table 视图的 frame 中的相应点偏移根视图中的 table 视图。

这个偏移量意味着无法为table中的最后一行检索对应的行; indexPathForRow(at:) returns nil 和你的函数 returns 什么都不做。

您可能还会发现,如果您用力触摸单元格的底部,您实际上会看到下一行。

您可以将 CGPoint 转换为 table 视图的框架,但在注册预览时将 table 视图指定为源视图更简单:

if (self.traitCollection.forceTouchCapability == .available){
    print("-------->", "Force Touch is Available")
    registerForPreviewing(with: self, sourceView: self.profileTableView)
}
else{
    print("-------->", "Force Touch is NOT Available")
}