0

我有一个使用自定义演示控制器的卡片的模式演示,效果很好。我现在需要为另一个弹出窗口使用演示控制器,但困难在于它需要有所不同。我在试图克服这个问题时遇到了多个问题。

第一个问题:我的视图控制器显然不能有两个相同的扩展,这意味着据我所知我只能引用一个 UIPresentationController 文件。但是,理想情况下,我需要第二个 UIPresentationController 来管理第二个 Presentation。

第二个问题:由于我不能有第二个扩展,我尝试在扩展中使用 if 语句,如下所示:

extension ThirdViewControllerPassenger: UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
    if something == something {
    PresentationController(presentedViewController: presented, presenting: presenting)
     } else {
     PresentationController2(presentedViewController: presented, presenting: presenting)
     }
}
}

那行不通,我猜是因为我无法更改扩展名的语法。错误是缺少回报。

第三个问题:我的最后一个想法是使用用户默认键来保存状态,然后检查我的 UIPresentationController 中每个函数的状态。例如,我会设置defaults.set("showTripOverview", forKey: "presentationStyle")然后将我的 UIPResentationController 函数拆分为两部分,如果presentationStyle 为“ShowTripOverview”,则另一部分为“ShowTripOverview”,否则为另一部分。这个想法运行良好,代码编译并且它似乎工作。但是没过多久,我注意到我在主 ViewController 中设置的所有默认值(必须在调用 UIPresentationController 之前运行!!)都设置为 nil。所以我所有的 if 调用都直接转到 else,这不是我想要的......

谁能向我解释如何解决这三个问题之一?我只需要能够以某种方式使用第二个 UIPresentationController 来调整动画等。对于第二个演示文稿。我不认为这是一件奇怪的事情,因为许多应用程序使用不同的方式来呈现事物。虽然在网上找不到任何东西......

4

1 回答 1

0

对于遇到同样问题并在这里登陆的任何人,以下内容对我有用(感谢@Paulw11)

就像添加一样简单

extension UIViewController: UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
    
    if presented is someVC {
        return PresentationController(presentedViewController: presented, presenting: presenting)
    } else {
        return PresentationController2(presentedViewController: presented, presenting: presenting)
    }
}

}

这基本上解决了我的第二个想法的问题。扩展运行得太早,无法使用默认值或其他一些变量。使用if presented is X, X 是呈现的 ViewController 解决了这个问题。请注意,由于仍在使用扩展,因此必须将委托设置为扩展所在的 ViewController。

于 2021-11-29T17:52:45.197 回答