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上下文菜单点击时如何显示或导航到当前的查看视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios 9 中以编程方式导航到另一个具有“当前上下文”表示的视图控制器,目标 C