iOS13上下文菜单点击时如何显示或导航到当前的查看视图

Posted

技术标签:

【中文标题】iOS13上下文菜单点击时如何显示或导航到当前的查看视图【英文标题】:iOS13 Context Menu How to show or navigate to the current peeking view when tapping on it 【发布时间】:2019-08-01 01:13:07 【问题描述】:

我正在尝试在 ios13 中的表格视图中实现“上下文菜单”(也尝试过集合视图,它们有同样的问题):

我按照here 的说明,用一堆照片创建了一个收藏视图,当 3d touch 时,我会得到一个带有动作列表的预览,如下所示:

Peek and Menu View

Collection View

UITableView 中的委托方法:

- (void)tableView:(UITableView *)tableView willCommitMenuWithAnimator:
(id<UIContextMenuInteractionCommitAnimating>)animator;

在collectionView中

- (void)collectionView:(UICollectionView *)collectionView willCommitMenuWithAnimator:
(id<UIContextMenuInteractionCommitAnimating>)animator;

两者都没有“indexPath”;

所以我无法传递我正在查看的当前单元格或索引。

我想实现这个委托方法,所以当我点击预览图像时,它将导航到预期的页面,其中包含绑定到当前单元格的信息。

我想要并尝试过的是这样的:

func collectionView(_ collectionView: UICollectionView, willCommitMenuWithAnimator animator: UIContextMenuInteractionCommitAnimating) 
    animator.addAnimations 
        self.show(PreviewViewController(image: UIImage(named: "indexpathString")), sender: self)
    

并且indexpathString 与当前选定的单元格或集合相关,因此我可以基于它来初始化视图控制器。

如果有任何其他方法可以做到这一点,请告诉我。

【问题讨论】:

我刚刚编辑完!谢谢。 在这个 Twitter 线程中提出了几个想法:twitter.com/steveshepard/status/1141499334376058881?s=20 【参考方案1】:

函数contextMenuInteraction(_:willCommitWithAnimator:) 已被tableView(_:willPerformPreviewActionForMenuWith:animator:) 取代,它提供与显示的菜单关联的UIContextMenuConfiguration。在您的菜单出现的地方,分配一个标识符,以便您识别该行。标识符应该是任何 NSCopying 对象 - 例如NSIndexPath:

override func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? 
    // Pass the indexPath as the identifier for the menu configuration
    return UIContextMenuConfiguration(identifier: indexPath as NSIndexPath, previewProvider: nil)  _ in
        // Empty menu for demonstration purposes
        return UIMenu(title: "", children: [])
    

然后在willPerformPreviewActionForMenuWith:animator: 函数中使用该标识符:

override func tableView(_ tableView: UITableView, willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, animator: UIContextMenuInteractionCommitAnimating) 
    guard let indexPath = configuration.identifier as? IndexPath else  return 

    // Use your index path to get your destination VC in some way; arbitrary example shown...
    let destinationVc = destinationViewController(for: indexPath)

    // Then animate the appearance of the VC with the provided animator
    animator.addAnimations 
        self.show(destinationVc, sender: self)
    

【讨论】:

感谢您的回答。我看到它似乎以与我刚刚点击单元格相同的方式更新我的数据模型。但是,当导航回来时,tableview 不会更新。我必须以另一种方式触发重新加载,然后数据是正确的。知道如何实现这一目标吗? “导航返回时表格视图不更新” - 你能澄清一下吗?您的意思是单元格未突出显示(就像它已被选中),还是您希望在 UI 中看到更新的其他模型更改? 感谢您的回复。实际上它现在似乎正在工作。我的意思是我已经使用展开 segues 在主视图控制器中重新加载数据,如果我以这种方式导航到详细信息页面,则在从详细信息页面返回时不会正确更新。但是 - 它现在似乎工作得很好! :) 在 Swift 5.1 中省略配置 嗨,兄弟,我正在使用上下文菜单并添加一些类似 facebook 的反应按钮,但无法点击,你遇到过这个问题吗?【参考方案2】:

animator 中有一个名为previewViewController 的属性,其类型为UIViewController?。这与您在tableView(_:contextMenuConfigurationForRowAt:point:) 中设置的previewProvider 相同,因此如果您将previewProvider 设置为目标视图控制器,您可以执行以下操作:

设置您的 previewProvider

override func tableView(
    _ tableView: UITableView,
    contextMenuConfigurationForRowAt indexPath: IndexPath,
    point: CGPoint
) -> UIContextMenuConfiguration? 
    return UIContextMenuConfiguration(
        identifier: nil,
        previewProvider:  () -> UIViewController? in
            let string = yourDataSource[indexPath.row]
            return PreviewViewController(image: UIImage(named: string))
        
    )
    // actionProvider has a default value of nil, so you can omit it

使用动画师来展示它

override func tableView(
    _ tableView: UITableView, 
    willPerformPreviewActionForMenuWith configuration: UIContextMenuConfiguration, 
    animator: UIContextMenuInteractionCommitAnimating
) 
    guard let destinationViewController = animator.previewViewController else 
        return
    

    animator.addAnimations 
        self.show(destinationViewController, sender: self)
    

【讨论】:

嗨,兄弟,我正在使用上下文菜单并添加一些类似 facebook 的反应按钮,但无法点击,你遇到过这个问题吗?

以上是关于iOS13上下文菜单点击时如何显示或导航到当前的查看视图的主要内容,如果未能解决你的问题,请参考以下文章

上下文菜单选择颜色和框架大小 Swift 5 iOS 13

如何在 ios 9 中以编程方式导航到另一个具有“当前上下文”表示的视图控制器,目标 C

使用 Sprite 的 CSS 导航菜单:如何突出显示当前页面的选项卡/按钮?

解析十种APP导航设计模式

SwiftUI:contextMenu 菜单

如何从 Outlook 功能区上下文菜单中获取当前邮件项目