transitionContext 中的视图控制器不正确

Posted

技术标签:

【中文标题】transitionContext 中的视图控制器不正确【英文标题】:Incorrect from View Controller in transitionContext 【发布时间】:2020-07-02 17:21:38 【问题描述】:

我有一个使用UITabBarControllerios 应用程序。它有 3 个选项卡,每个选项卡都包含一个 UINavigationController 作为根。在我的一个标签中,我以模态和全屏方式呈现ViewController。从该视图控制器中,我使用我自己的UIViewControllerContextTransitioning 实现呈现了一个自定义模式ViewController。一切正常。但我想让父视图不是模态全屏,而是被推送到导航堆栈上。推送工作正常,但是当我在这种情况下呈现自定义模式时,它不起作用。我在调试器中看到的是来自 VC 的 transitionContext 是我的UITabBarController。我确认在我想要的ViewController(即被推送的那个)上拨打了出席电话。我无法弄清楚为什么这会失败。有没有人遇到过这样的问题。我可以尝试在这里发布一些示例代码来说明这是否有帮助或我的描述不清楚。

这里有一些代码 sn-ps: 请注意,Router 对象管理表示。在大多数情况下,它只是在 pushViewController 上转发或对正确的视图控制器进行调用。 VCFactory 返回所需的 ViewController。

这是视图控制器的第一次推送。如果我使用“present”而不是 pushViewController(将 vc 呈现为全屏模式)一切正常。

Router.pushViewController(VCFactory.ScorecardTab.scorecard(scorecard: selectedScorecard), animated: true)

这是我正在尝试做的模态演示。我传入了 .custom 的演示风格,并传入了转换委托。在这种情况下,转换委托是由上一次推送(或当前)显示的视图控制器,如上面的代码所示。

Router.present(ViewControllerFactory.ScorecardTab.scoreEntry(selectedCourse: course, selectedPlayer: tappedPlayer, selectedHoleNumber: tappedHoleNumber, scoreEntryDelegate: self, scoreEntryDataSource: AnyEquatableScoreCardViewDataSource(self)), presentationStyle: .custom, transitioningDelegate: transitionDelegate)

最后是我的转换委托实现:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) 
    let fromView = transitionContext.viewController(forKey: .from)!.view!
    let toView = transitionContext.viewController(forKey: .to)!.view!

在这种情况下,视图控制器显示为我的 UITabBarController,而不是上面第一个代码 sn-p 中推送的预期视图控制器。

在呈现视图控制器 viewDidLoad 中,我尝试使用以下方法添加设置定义PresentationContext:

    override func viewDidLoad() 
        super.viewDidLoad()
        
        definesPresentationContext = true

在调试器中,我确认它已设置为 true,但我仍将 UITabBarController 视为“来自”VC。

【问题讨论】:

【参考方案1】:

我猜你说的是UIViewController.definesPresentationContext。见https://developer.apple.com/documentation/uikit/uiviewcontroller/1621456-definespresentationcontext?language=objc

definesPresentationContext = YES设置为你想成为from VC的VC。

如果您为您的 VC 层次结构提供一个非常简短的代码示例,我可以提供更多帮助。弄清楚您的设置和预期的行为有点困难。

【讨论】:

谢谢我尝试设置为 true,但结果相同。我在帖子中添加了一些代码,可能有助于更好地说明问题。 很抱歉,我不记得有关此 API 的所有详细信息,但 modalPresentationStyle = .overCurrentContext 也应与 definesPresentationContext = true 结合使用。 啊,谢谢,看起来它可以解决问题。我不确定使用该 prostyle 是否会不使用我的自定义过渡,但确实如此。非常感谢!

以上是关于transitionContext 中的视图控制器不正确的主要内容,如果未能解决你的问题,请参考以下文章

在 UIViewControllerAnimatedTransitioning 委托中,transitionContext.fromViewController 为 nil

如何从嵌入在视图控制器中的表视图中的集合视图中传递数据并推送新的视图控制器?

如何将视图控制器中的数据传递给另一个视图控制器中的集合视图? [复制]

从容器视图中的选项卡栏控制器中的视图控制器委派信息

视图中的内容和视图控制器中的内容是啥?

拆分视图中的集合视图控制器不更新