在presetentation演示之前失去对transitioningDelegate的引用

时间:2016-07-22 21:03:20

标签: ios swift uiviewcontroller uipresentationcontroller xcode8-beta2

我在Xcode beta 2和iOS 10 beta 2之前有一个可用的自定义UIPresentationController。我还没有更改任何代码,但现在正在使用标准模式演示文稿呈现。

UIPresentationController的Apple示例代码中有一条说明:

  

对于将使用自定义演示控制器的演示文稿,   该演示控制器也可能是   transitioningDelegate。这避免了引入另一个对象或   在源头实施   查看控制器。

     

transitioningDelegate不保存对其目标对象的强引用。以防止presentationController出现   在调用-presentViewController之前发布:animated:completion:   NS_VALID_UNTIL_END_OF_SCOPE属性将附加到   声明。

我在演示之前和之后检查了呈现的视图控制器上的transitioningDelegate。在它是我的自定义UIPresentationController之前,但它之后是零。我的猜测是该引用正在发布,但我在Swift中找不到与NS_VALID_UNTIL_END_OF_SCOPE等效的内容。 编辑:我已经确认transitioningDelegate已设置到演示文稿之前,然后在出现时为零。

我在呈现视图控制器中的代码:

@IBAction func buttonAction(_ sender: UIButton) {
    let secondViewController = storyboard!.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
    let presentationController = MyPresentationController(presentedViewController: secondViewController, presenting: self)
    presentationController.initialFrame = button.frame
    secondViewController.transitioningDelegate = presentationController

    // Move map
    let pixelsToMove: CGFloat = mapView.frame.height / 4
    let region = self.mapView.region

    self.mapView.setRegion(region, offsetBy: pixelsToMove, animated: true)

    // Delegate to NewViewController
    secondViewController.mapView = mapView
    mapView.delegate = secondViewController

    print(secondViewController.transitioningDelegate)
    UIView.animate(withDuration: 0.3, animations: {
        let tabBar = self.tabBarController!.tabBar
        tabBar.frame.origin.y += tabBar.frame.height

        self.present(secondViewController, animated: true, completion: nil)
    })
}

我在UIPresentationController中的代码:

override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
    super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
    presentedViewController.modalPresentationStyle = .custom
}

2 个答案:

答案 0 :(得分:4)

transitioningDelegate属性为weak var。请参阅docs here。这意味着在设置presentationController时,secondViewController.transitioningDelegate = presentationController的保留计数不会增加。由于您在该方法中实例化presentationController并且没有其他任何内容具有对该对象的强引用,因此它的保留计数将变为0,并且一旦从该函数返回控制它就会为零(在{{1之后)因为print(secondViewController.transitioningDelegate)是异步的)。

在整个视图控制器的演示过程中,您需要一些东西来保持对UIView.animate(...)的强引用。如果你特意将该引用设置为presentationController,那么保留计数将不会低于1。一种解决方案是将其保留为当前类的属性或nil的属性。

答案 1 :(得分:2)

问题出在beta 2中UIViewControllerTransitioningDelegate中的方法签名发生了变化,因此我的代码中没有调用它们。我不明白为什么,但是如果没有明确地存储对表示控制器的强引用,一切都很完美。