2014-10-08 6 views
3

에 나는 오류가 계속되지 :사용자 스토리 보드 SEGUE 시뮬레이터에서 작동하지만 장치

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController.' 

새로운 뷰 컨트롤러로 전환하려고합니다. 다음은 뷰 컨트롤러를 전환 SEGUE이다 : 나는 SEGUE 클래스에 내 전환 클래스의 이름을 넣어하려고해도

image

, 그것은 여전히 ​​내 장치의 오류를 제공,하지만 시뮬레이터에서 완벽하게 작동합니다.

는 전환 클래스의 코드 : 내가 놓친 거지 아무것도

class TransitionManager: UIStoryboardSegue, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate { 

private var presenting = true 

// MARK: UIViewControllerAnimatedTransitioning protocol methods 

// animate a change from one viewcontroller to another 
func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 

    // get reference to our fromView, toView and the container view that we should perform the transition in 
    let container = transitionContext.containerView() 
    let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)! 
    let toView = transitionContext.viewForKey(UITransitionContextToViewKey)! 

    // set up from 2D transforms that we'll use in the animation 
    let π : CGFloat = 3.14159265359 

    let offScreenRight = CGAffineTransformMakeRotation(-π/2) 
    let offScreenLeft = CGAffineTransformMakeRotation(π/2) 

    // prepare the toView for the animation 
    toView.transform = self.presenting ? offScreenRight : offScreenLeft 

    // set the anchor point so that rotations happen from the top-left corner 
    toView.layer.anchorPoint = CGPoint(x:0, y:0) 
    fromView.layer.anchorPoint = CGPoint(x:0, y:0) 

    // updating the anchor point also moves the position to we have to move the center position to the top-left to compensate 
    toView.layer.position = CGPoint(x:0, y:0) 
    fromView.layer.position = CGPoint(x:0, y:0) 

    // add the both views to our view controller 
    container.addSubview(toView) 
    container.addSubview(fromView) 

    // get the duration of the animation 
    // DON'T just type '0.5s' -- the reason why won't make sense until the next post 
    // but for now it's important to just follow this approach 
    let duration = self.transitionDuration(transitionContext) 

    // perform the animation! 
    // for this example, just slid both fromView and toView to the left at the same time 
    // meaning fromView is pushed off the screen and toView slides into view 
    // we also use the block animation usingSpringWithDamping for a little bounce 
    UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.8, options: nil, animations: { 

     // slide fromView off either the left or right edge of the screen 
     // depending if we're presenting or dismissing this view 
     fromView.transform = self.presenting ? offScreenLeft : offScreenRight 
     toView.transform = CGAffineTransformIdentity 

     }, completion: { finished in 

      // tell our transitionContext object that we've finished animating 
      transitionContext.completeTransition(true) 

    }) 

} 

// return how many seconds the transiton animation will take 
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { 
    return 0.75 
} 

// MARK: UIViewControllerTransitioningDelegate protocol methods 

// return the animataor when presenting a viewcontroller 
// remmeber that an animator (or animation controller) is any object that aheres to the UIViewControllerAnimatedTransitioning protocol 
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

    // these methods are the perfect place to set our `presenting` flag to either true or false - voila! 
    self.presenting = true 
    return self 
} 

// return the animator used when dismissing from a viewcontroller 
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    self.presenting = false 
    return self 
} 

override func perform() { 
    // 
} 

} 

있습니까? 아니면 어떻게 작동시킬 수 있습니까?

답변

2

일반적으로 오류는 사용자가 푸시 (Push Segue)를 수행하려고하고 있음을 나타내며 제시된보기 컨트롤러가 UINavigationController으로 관리되지 않음을 나타냅니다. 간단한 해결책은 대개 NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController에 요약 된 바와 같이 네비게이션 제어기에 프리젠 테이션 (즉, from) 뷰 제어기를 내장하는 것이다.

하지만 자신 만의 UIStoryboardSegue 클래스를 굴렸으므로 기본 푸시 세그 애니메이션을 사용하지 않는 것으로 판단됩니다.

override func perform() { 
    let fromVC = sourceViewController as UIViewController 
    let toVC = destinationViewController as UIViewController 

    fromVC.presentViewController(toVC as UIViewController, animated: true, completion: nil) 
} 
+0

이이 문제를 해결나요 : 당신은 당신의 transitioningDelegate을 관리하는 방법을 모르고, 내 생각 엔 당신이 그것을 밀어 대신 실제로 뷰 컨트롤러를 제시 perform()를 오버라이드 (override) 할 필요가 무엇입니까? – rainypixels

관련 문제