2016-11-05 2 views
2

У меня есть 2 segues в той же readyForSegue, один подключается к подклассу UIViewController, а другой подключается к подклассу UICollectionViewController. Я пытаюсь использовать переключатель/case с полиморфизмом для установки моего целевогоViewController, но downcast, который я делаю внутри коммутатора, не виден вне его, он продолжает видеть var как UIVC, как было объявлено первоначально. Что я здесь делаю неправильно? Ошибка «Значение типа„UIViewController“не имеет ни один из членов„контекста“»Не могу я опуститься внутри переключателя? (Swift 3)

let identifier: String! 
var destinationTest: UIViewController! 

    switch identifier { 
    case "Add Exercise": 
      destinationTest = segue.destination as! AddExerciseViewController 
    case "addExerciseInCollectionView": 
      destinationTest = segue.destination as! AddExerciseCollectionVC 
    default: 
     break 
    } 

destinationTest.context = self.context 
+2

'destinationTest' объявлен как' UIViewController', так что это все, что у вас будет для переменной. Он может указывать на другие подклассы 'UIViewController', но вы не сможете получить доступ к каким-либо конкретным свойствам/функциям подкласса, используя переменную' UIViewController'. FYI - это не имеет никакого отношения к использованию «switch». – rmaddy

+2

Для кода, с которым вы должны работать, вашим двум классам диспетчера классов необходимо либо поделиться суперклассом (или лучше) реализовать протокол, в котором вводится свойство 'context'. Затем вы можете использовать этот класс/протокол вместо 'UIViewController' как тип' destinationTest' – Paulw11

+0

Хорошо, они оба наследуются от UIViewController, однако свойство контекста объявлено в третьем подклассе UIViewController, подкласса sibling. Я понял, почему даже после опускания эти два контроллера не могут увидеть мою собственность. Я думал, что это проблема с областью внутри коммутатора, LOL. Спасибо, ребята! – sylvia

ответ

0

Как сказал RMaddy, вы объявили destinationTest как UIViewController, так что даже если вы назначаете конкретные UIViewController подклассов внутри переключатель , все компиляторы знают, что destinationTest - это UIViewController, поэтому вы не можете получить доступ к каким-либо свойствам подкласса с помощью этой переменной.

Вы либо нужны ваши два подкласса вид контроллера, чтобы наследовать от общего суперкласса, который определяет context собственность и объявить destinationTest быть из этого суперкласса или использовать протокол, который обеспечивает context свойство:

property HasContext { 
    var context: Context { set get } 
} 

class AddExerciseViewController: UIViewController, HasContext { 

    var context: Context 

    ... 
} 

class AddExerciseCollectionVC: UIViewController, HasContext { 

    var context: Context 

    ... 
} 

Тогда вы можете сказать

let identifier: String! 
var destinationTest: HasContext! 

switch identifier { 
    case "Add Exercise": 
      destinationTest = segue.destination as! HasContext 
    case "addExerciseInCollectionView": 
      destinationTest = segue.destination as! HasContext 
    default: 
     break 
} 

destinationTest.context = self.context 
1

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

switch (segue.identifier, segue.destination) { 
case ("Add Exercise", let controller as AddExerciseViewController: 
    controller.context = self.context 
case ("addExerciseInCollectionView", let controller as AddExerciseCollectionVC: 
    controller.context = self.context 
default: 
    break 
} 
Смежные вопросы