Зачем вызывать presentViewController в конце пользовательского перехода, это приводит к тому, что viewDidAppear вызывается дважды?

В моем подклассе UIStoryboardSegue я использую presentViewController в конце метода выполнения, это приводит к тому, что viewDidAppear/viewWillAppear вызывается дважды?

Как я могу предотвратить это?

Спасибо

Текущий код:

override func perform() {

    // Assign the source and destination views to local variables
    let sourceView = sourceViewController.view as UIView!
    let destView = destinationViewController.view as UIView!

    // Get the screen width and height
    let screenWidth = UIScreen.mainScreen().bounds.size.width
    let screenHeight = UIScreen.mainScreen().bounds.size.height

    // Specify the initial position of the destination view
    destView.frame = CGRectMake(0.0, screenHeight, screenWidth, screenHeight)

    // Add the destination view to the window
    let window = UIApplication.sharedApplication().keyWindow
    window?.insertSubview(destView, aboveSubview: sourceView)

    // Animate the transition
    UIView.animateWithDuration(0.7, animations: { () -> Void in

        // Scale down the source view
        sourceView.transform = CGAffineTransformScale(sourceView.transform, 0.90, 0.90)

        }) { (Finished) -> Void in
    }

    UIView.animateWithDuration(1.0, delay: 0.2, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.7, options: .CurveEaseOut, animations: { () -> Void in

        destView.frame = CGRectOffset(destView.frame, 0.0, -screenHeight)

        }) { (finished) -> Void in

            self.sourceViewController.presentViewController(self.destinationViewController as UIViewController, animated: false, completion: nil)
    }
}

Теперь я вижу, что без presentViewController новый контроллер уничтожается вскоре после пользовательского перехода к анимации. Я понимаю, зачем нам это нужно.


person Shay    schedule 27.12.2015    source источник
comment
когда вы добавляете print((unsafeAddressOf(self))) в свой viewDidAppear целевого VC, выводит ли это тот же адрес?   -  person Christian 'fuzi' Orgler    schedule 27.12.2015
comment
Да (и круто). Пробовал 3 раза.   -  person Shay    schedule 27.12.2015
comment
хорошо, сейчас запустим код appcoda и потом отредактирую свой ответ   -  person Christian 'fuzi' Orgler    schedule 27.12.2015


Ответы (1)


Причина, по которой viewDidAppear вызывается дважды, заключается в том, что вы сначала вставляете контроллер представления как подпредставление в keyWindow. (который запускает viewDidAppear) введите здесь описание изображения

а затем представить контроллер представления. (что также вызывает viewDidAppear) введите здесь описание изображения

Это также приводит к некоторым побочным эффектам для вашего приложения, потому что вы получите viewHierachy, например:

-- KeyWindow
---- FirstVC View
---- SecondVC View
---- UITransitionView (because of the presentVC)
------- SecondVC View

Если вы хотите добиться этого перехода прокрутки/прокрутки, почему бы просто не использовать scrollView и иметь в нем дочерние контроллеры?

Другим решением для этого может быть использование пользовательского перехода и простой вызов presentViewController с пользовательским переходом, как описано здесь: http://www.raywenderlich.com/113845/ios-animation-tutorial-custom-view-controller-presentation-transitions

person Christian 'fuzi' Orgler    schedule 27.12.2015
comment
Хорошо спасибо. Но почему респектабельные сайты делают это в своих туториалах? Они помещают presentViewController в конец метода выполнения? - person Shay; 27.12.2015
comment
@ Shay, вы не могли бы быть более неконкретным ^^, пожалуйста, скажите, используйте сайт, чтобы мы могли проверить сами. - person luk2302; 27.12.2015
comment
не могли бы вы дать ссылку? Может я неправильно понял ваш вопрос :) - person Christian 'fuzi' Orgler; 27.12.2015
comment
Только что попробовал в моем коде без использования presentViewController и без отклонения ViewControllerAnimated в пользовательском переходе раскрутки. Оно сломалось. Для этого нам нужен presentViewController. - person Shay; 27.12.2015
comment
Добавьте код и важный комментарий. Также протестирован код appcoda, те же результаты. - person Shay; 27.12.2015
comment
Спасибо, Кристиан, проверьте другую анимацию, вы не можете сделать это с прокруткой, как вы знаете. Также у меня есть больше отличных анимационных переходов, так что эта пользовательская техника перехода превосходна. Спасибо за ссылку, мне нужен надежный способ добиться всей анимации, которую я сделал, используя пользовательский переход. - person Shay; 27.12.2015
comment
Я бы порекомендовал сделать первую анимацию через scrollView, так как пользователь также имеет лучший опыт, чем этот переход. Для второй анимации вы можете добиться этого с помощью пользовательского перехода презентации, почему бы не сделать это? :) - person Christian 'fuzi' Orgler; 27.12.2015
comment
Пользовательский переход презентации? Вы имеете в виду, используя ссылку, которую вы предоставили? Если да, значит, у меня есть книга, я еще не добрался до этой главы, сейчас буду ее читать. - person Shay; 27.12.2015