2016-05-12 2 views
0

Во время рефакторинга приложения от Objective-C до Swift я столкнулся с проблемой, которую я не могу решить самостоятельно.Как использовать обработчик завершения в rejectViewControllerAnimated с помощью Swift?

ViewControllerOne имеет способ
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender. В этом методе я устанавливаю destinationViewController:
ViewControllerTwo *viewControllerTwo = [segue destinationViewController];
и некоторый блок обработчика, как это:

[viewControllerTwo setHandlerOne:^(id sender) { 
    [...] 
}] 

Затем, коснувшись кнопки я показываю модальное представление. В модальный контроллер представления ViewControllerTwo Я закрываю этот вид модального:

- (IBAction)buttonPressed:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    self.handlerOne(sender); 
} 

В Swift код, который я настроил же:
ViewControllerOne методом:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
Установите переключатель destinationViewController
let vc = segue.destinationViewController as! ViewControllerTwo
И кодный код:

vc.setHandlerOne {() -> Void in 
    [...] 
} 

Таким образом, я получаю сообщение об ошибке Value of type 'ViewControllerTwo' has no member 'setHandlerOne'. Что мне здесь не хватает? Должен ли я вручную установить его в viewControllerTwo?

+0

Вы уверены, что ваш destinationViewController является объектом ViewControllerTwo? –

+1

Сообщите вашему быстрому, что дает вам ошибка – dan

+1

Неверный код. Проблема заключается в вашем коде Swift. Покажите свой код Swift. Не ваш код Objective-C. Никто не заботится о коде Objective-C. Это не вызывает ошибки, не так ли? – matt

ответ

0

Я думаю, что ваш destinationViewController не является ViewControllerДва типа или может быть возможным, если ваш destinationViewController является ViewControllerTwo, то ViewControllerTT не содержит метод setHandlerOne.

+0

Спасибо за ваш вклад. Как вы видите, 'destinationViewController' является' viewControllerTwo'. И мой 'viewControllerTwo' имеет свойство' handlerOne'. И это свойство, которое я пытаюсь установить в 'prepareForSegue' в' viewControllerOne'. –

0

В Swift вы можете делать то, что вы описаны как:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let viewControllerTwo: ViewControllerTwo = segue.destinationViewController as? ViewControllerTwo{ 
     viewControllerTwo.setHandler({ (sender) in 

     }) 
    } 
} 

и в ViewControllerTwo определяют метод:

func setHandler(completion:((AnyObject?) -> Void)?){ 

} 

Я отправил версию с блоком завершения ...

+0

Благодарим вас за ответ. Но мне нужно определить установщика свойства 'handlerOne' в методе' prepareForSegue', а не просто вызвать метод из 'viewControllerTwo'. Пожалуйста, посмотрите пример Objective-C. –

+0

Метод должен всегда определяться внутри контроллера вида, вы говорите о обработчике завершения? – ciccioska

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