2

我试图用dismissViewControllerAnimated(true, completion: {}) 关闭UIViewController,但尝试执行此操作时得到EXC_BAD_ACCESS。(也就是说,在其工作的 10 次中有 1 次)。

我使用了自定义的 transitionDelegate,当我没有设置它时,它的工作。

ListTransitionDelegate 返回动画师和presentationController。

PresentationController 看起来像这样

    init(presentingViewController: UIViewController!, presentedViewController: UIViewController!, controllerStyle: SideControllerStyle, shortest: CGFloat) {
    self.controllerStyle = controllerStyle
    self.shortest = shortest

    super.init(presentingViewController: presentingViewController, presentedViewController: presentedViewController)

    self.dimmingView.backgroundColor = UIColor.blackColor()

    var tapGesture = UITapGestureRecognizer(target: self, action: Selector("closePresented"))
    dimmingView.addGestureRecognizer(tapGesture)
}

override func adaptivePresentationStyle() -> UIModalPresentationStyle
{
    return UIModalPresentationStyle.OverFullScreen
}

override func shouldPresentInFullscreen() -> Bool
{
    return true
}

override func presentationTransitionWillBegin() {
    var containerView = self.containerView
    self.dimmingView.frame = self.containerView.bounds
    containerView.insertSubview(self.dimmingView, atIndex:0)

    presentedViewController.transitionCoordinator().animateAlongsideTransition({context in
        self.dimmingView.alpha = 0.5
        }, completion:nil)
}

override func presentationTransitionDidEnd(completed: Bool)
{
    if !completed {
        self.dimmingView.removeFromSuperview()
    }
}

override func dismissalTransitionDidEnd(completed: Bool)
{
    self.dimmingView.removeFromSuperview()
}

override func dismissalTransitionWillBegin() {
    presentedViewController.transitionCoordinator().animateAlongsideTransition({context in
        self.dimmingView.alpha = 0
        }, completion: nil)
}

func closePresented() {
    var presenting = self.presentingViewController

   presentedViewController.dismissViewControllerAnimated(true, completion: nil)
}

override func sizeForChildContentContainer(container: UIContentContainer!, withParentContainerSize parentSize: CGSize) -> CGSize {
    var size : CGSize

    switch self.controllerStyle {
    case .Left, .Right:
        size = CGSizeMake(self.shortest, parentSize.height)

    case .Bottom, .Top:
        size = CGSizeMake(parentSize.width, self.shortest)

    default:
        size = CGSizeMake(parentSize.width, parentSize.height)
    }

    return size
}

override func frameOfPresentedViewInContainerView() -> CGRect {
    var frame : CGRect
    var size = sizeForChildContentContainer(nil, withParentContainerSize: containerView.bounds.size)

    switch self.controllerStyle {
    case .Left:
        frame = CGRectMake(containerView.bounds.size.width - size.width, 0, size.width, size.height)

    case .Right:
        frame = CGRectMake(0, 0, size.width, size.height)

    case .Bottom:
        frame = CGRectMake(0, containerView.bounds.size.height - size.height, size.width, size.height)

    case .Top:
        frame = CGRectMake(0, 0, size.width, size.height)

    default:
        frame = CGRectMake(0, 0, size.width, size.height)
    }
    return frame
}
4

4 回答 4

4

尝试在您的方案设置中启用僵尸对象。(请记住在完成后将其关闭,因为该更改不会显示在您的源代码管理中,而且您真的不想在没有 ARC 的情况下发布应用程序!)

如果您收到错误消息

-[_UILayoutGuide superview]: message sent to deallocated instance 0x1781ac6a0

然后只需将此代码添加到正在关闭的视图控制器中:

deinit {
    self.view.removeFromSuperview()
}

UILayoutGuide是一个私有的自动布局类。我认为这是一个错误(并因此提交),因为为什么被解雇的视图控制器需要自动布局?从其父视图中删除一个类将抢先阻止自动布局约束在它们被释放后被访问。

于 2014-08-02T20:21:03.263 回答
2

斯威夫特 1.1

尝试使用 in completion params 而不是niluse {}。例如: presentedViewController.dismissViewControllerAnimated(true, completion: {})

于 2014-07-14T14:02:23.507 回答
1

在关闭 viewController 之前,您应该将 TransitioningDelegate 设置为 nil。

于 2014-09-14T04:35:05.833 回答
-1

我有同样的问题。我必须声明类变量

class firstVC : UIViewController
{
    let customTransitioninDelegate = customTransitioninDelegate().
...

    //Then when created second view controller just assign it
    -func xxx()
    { 
        var secondVC = secondVC();
        secondVC.transitioningDelegate = customTransitioninDelegate;
        self.presentViewController(secondVC, animated: true, completion: nil); 
    }
}
class secondVC: UIViewController
{
...
    func xxx()
    {
        if(self.presentingViewController != nil)
        {
            self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil);
        }
    }
}

解雇工作。

于 2014-12-19T18:33:41.773 回答