2014-08-31 3 views
3

У меня возник вопрос относительно быстрой реализации метода, указанного в названии. Если я это сделаю:UIView.animateWithDuration завершение

leadingSpaceConstraint.constant = 0 
UIView.animateWithDuration(0.3, animations: { 
    self.view.layoutIfNeeded() 
}, completion: { (complete: Bool) in 
    self.navigationController.returnToRootViewController(true) 
}) 

У меня возникает следующая проблема: Отсутствует аргумент для параметра «delay» в вызове. Это происходит только в том случае, если у меня есть self.navigationController.returnToRootViewController() в части завершения. Если я извлечу этот отчет в отдельный метод, например:

leadingSpaceConstraint.constant = 0 
UIView.animateWithDuration(0.3, animations: { 
    self.view.layoutIfNeeded() 
}, completion: { (complete: Bool) in 
    self.returnToRootViewController() 
}) 

func returnToRootViewController() { 
    navigationController.popToRootViewControllerAnimated(true) 
} 

Тогда он отлично работает и делает именно то, что я хочу. Конечно, это не идеальное решение и больше похоже на работу. Может ли кто-нибудь сказать мне, что я сделал не так, или почему Xcode (бета-версия 6) ведет себя так?

+0

Это долгое время было распространенной причиной вопросов. Это всегда проявляется по-разному ... см. Ответ здесь: http: //stackoverflow.com/questions/24338842/what-am-i-doing-wrong-in-swift-for-calling-this-objective-c-block- api-call/24347498 # 24347498 – Jack

+0

Возможный дубликат [анимацияWithDuration: анимация: завершение: в Swift] (http://stackoverflow.com/questions/24296023/animatewithdurationanimationscompletion-in-swift) – Jack

+0

Ha. Я знал, что об этом ответили раньше, но не нашел обманщика. (На самом деле, я почти уверен, что я ответил на это до этого обмана, но я не могу найти его в своей истории.) – rickster

ответ

8

Предполагаете, вы имеете в виду popToRootViewControllerAnimated в вашем первом фрагменте, так как returnToRootViewController - это не метод на UUNavigationController.

Ваша проблема в том, что popToRootViewControllerAnimated имеет возвращаемое значение (массив диспетчеров вида удален из стека навигации). Это вызывает проблемы, даже если вы пытаетесь отбросить возвращаемое значение.

Когда Swift видит вызов функции/метода с возвращаемым значением в качестве последней строки замыкания, предполагается, что вы используете сокращенный сокращенный синтаксис для неявных возвращаемых значений. (Тип, который позволяет писать такие вещи, как someStrings.map({ $0.uppercaseString }).) Тогда, поскольку у вас есть закрытие, которое возвращает что-то в том месте, где вы ожидаете передать закрытие, которое возвращает void, вызов метода не может проверить тип. Ошибки проверки типов, как правило, приводят к плохим диагностическим сообщениям - я уверен, что это поможет, если вы получите filed a bug с кодом, который у вас есть, и с сообщением об ошибке, которое он производит.

Во всяком случае, вы можете обойти это, сделав последнюю строку замыкания не выражением со значением. Я предпочитаю явные return:

UIView.animateWithDuration(0.3, animations: { 
    self.view.layoutIfNeeded() 
}, completion: { (complete: Bool) in 
    self.navigationController.popToRootViewControllerAnimated(true) 
    return 
}) 

Вы также можете назначить этот popToRootViewControllerAnimated вызов неиспользуемых переменный или положить выражение, которое ничего не делает после этого, но я думаю, что return утверждение ясное.

+0

спасибо за объяснение и спасибо за решение. работает как шарм :) – c2programming

Смежные вопросы