在iOS中将Peek和Pop与Popover相结合

在iOS中将Peek和Pop与Popover相结合,ios,storyboard,Ios,Storyboard,在iOS中是否可以将偷看和弹出与Popor结合起来 我想在支持3D触摸的iPhone上使用peek和pop,同时在iPad上使用popover 当我尝试在故事板中组合它时,我得到错误“无法编译连接” 我自己找到了答案 问题是,PopOver的锚点指向动态创建的原型单元,因此系统不确定哪个单元是锚点 因此,解决方案如下: 将弹出窗口的定位点设置为表格视图 从故事板序列中删除peek&pop功能,因为我们需要在代码中执行此操作 转到您的UITableViewDataSource(在我的例子中,它是视

在iOS中是否可以将偷看和弹出与Popor结合起来

我想在支持3D触摸的iPhone上使用peek和pop,同时在iPad上使用popover

当我尝试在故事板中组合它时,我得到错误“无法编译连接”


我自己找到了答案

问题是,PopOver的锚点指向动态创建的原型单元,因此系统不确定哪个单元是锚点

因此,解决方案如下:

  • 将弹出窗口的定位点设置为表格视图
  • 从故事板序列中删除peek&pop功能,因为我们需要在代码中执行此操作
  • 转到您的
    UITableViewDataSource
    (在我的例子中,它是视图控制器),并使用单元格作为源视图将以下内容添加到您的
    cellForRowAt()
  • 如果需要,可以稍微居中定位点(源代码视图):
  • 对此感到高兴,并对这个答案投赞成票
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCellIdentifier", for: indexPath) as! MyTableViewCell
        let item = items[indexPath.row]
        // Pass the item here...
        registerForPreviewing(with: self, sourceView: cell) // <== Add this
        return cell
    }
    
    extension ListeningVC: UIViewControllerPreviewingDelegate {
        func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
            guard let indexPath = tableView.indexPathForRow(at: location) else {
                return nil
            }
            // get the item you want to pass using the index path
            let item = items[indexPath.row]
            // get the destination view controller
            let destination = UIStoryboard(name: "...", bundle: nil).instantiateInitialViewController()
            // Pass the item here...
            return destination // return the destination view controller
        }
    
        func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
            // either present the view controller or add it to your navigation controller here
            present(viewControllerToCommit, animated: true)
        }
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.identifier {
        case "mySegueIdentifier":
            guard let cell = sender as? MyTableViewCell else { return }
            guard let indexPath = tableView.indexPath(for: cell) else { return }
            let item = items[indexPath.row]
            let destination = segue.destination
            // Pass the item here...
            if let popOver = segue.destination.popoverPresentationController {
                // set the cell as source view
                let origin = CGPoint(x: 100, y: cell.frame.origin.y)
                let size = CGSize(width: 200, height: cell.frame.height)
                popOver.sourceView = tableView
                popOver.sourceRect = CGRect(origin: origin, size: size)
            }
        default:
            break
        }
    }