我有一个包含列表的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)
}
}
然后,在我注册的viewDidLoad()
的同一文件 ProfileVC.swift 中
if (self.traitCollection.forceTouchCapability == .available){
print("-------->", "Force Touch is Available")
registerForPreviewing(with: self, sourceView: view)
}
else{
print("-------->", "Force Touch is NOT Available")
}
我不知道为什么无法单击第4 个单元格。
该行的最后单元格不会触发“窥视与弹出”。
人们将如何进行进一步的调试?
答案 0 :(得分:1)
您正在将视图控制器的根view
注册为peek上下文的源视图。结果,传递给previewingContext(_ viewControllerForLocation :)的CGPoint
在该视图的坐标空间中。
当您尝试从表视图中检索相应的行时,该点实际上将根据表视图在根视图中的相对位置而偏离表视图frame
中的相应点。
此偏移量表示无法为表的最后一行检索对应的行; indexPathForRow(at:)
返回nil
,并且您的函数不执行任何操作而返回。
您还可能会发现,如果强行触摸单元格的底部,则实际上可以看到下一行。
您可以将CGPoint
转换为表格视图的框架,但是在注册预览时只需将表格视图指定为源视图会更简单:
if (self.traitCollection.forceTouchCapability == .available){
print("-------->", "Force Touch is Available")
registerForPreviewing(with: self, sourceView: self.profileTableView)
}
else{
print("-------->", "Force Touch is NOT Available")
}