我在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
}
答案 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
中的方法签名发生了变化,因此我的代码中没有调用它们。我不明白为什么,但是如果没有明确地存储对表示控制器的强引用,一切都很完美。