2

UIViewControllerAnimated(true, completion: {}) を使用して UIViewController を閉じようとしていますが、実行しようとすると EXC_BAD_ACCESS が発生します。(つまり、10 回に 1 回は機能します)。

カスタムの transitionDelegate を使用しましたが、それを設定していない場合は機能します。

ListTransitionDelegate はアニメーターと 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

次に、このコードを閉じられるView Controllerに追加するだけです:

deinit {
    self.view.removeFromSuperview()
}

UILayoutGuideプライベート自動レイアウト クラスです。これはバグだと思います (そして、そのようにファイルしました)。 なぜなら、閉じられたビュー コントローラーに自動レイアウトが必要になるのはなぜですか? スーパービューからクラスを削除すると、割り当てが解除された後に自動レイアウト制約にアクセスできなくなります。

于 2014-08-02T20:21:03.263 に答える
2

スイフト 1.1

niluseの代わりに in completion params を使用してみてください{}。例えば: 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 に答える