#swift #casting #uiviewcontroller
Вопрос:
Я пытаюсь передать перечисление в a UIViewController
в другой раскадровке, но ошибка в том, что UIViewController
в нем нет элемента ViewType
. Когда я проверил тип переменной после форсирования !
, он все еще UIViewController
не является QuotesTestmoniesViewController
Почему тип переменной не изменяется на новый тип контроллера представления? Что я здесь делаю не так?
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
var viewController = UIViewController()
switch indexPath.item {
//Saints
case 0:
viewController = self.amiStoryboard.instantiateViewController(withIdentifier: "militarysaintscontroller") as! SaintsViewController
self.navigationController?.pushViewController(viewController, animated: true)
//Prayers
case 1:
break;
//Testmonies
case 2:
break;
//Quotes
case 3:
viewController = self.amiStoryboard.instantiateViewController(withIdentifier: "militaryquotestestmoniescontroller") as! QuotesTestmoniesViewController
viewController.viewType = ViewType.Quotes //ERROR
self.navigationController?.pushViewController(viewController, animated: true)
default:
return
}
}
Комментарии:
1. Попробуйте это :
(viewController as? QuotesTestmoniesViewController).viewType = ViewType.Quotes
2. Да, похоже, это работает. Но почему тип не изменился с первого раза? Это ошибка или что-то в этом роде?
3. Вам не нужно писать свой код так беспорядочно, как этот актерский состав
Ответ №1:
Похоже, вы пытаетесь использовать одну строку для нажатия на другой контроллер представления.
Но в коде у вас также написана push-строка для всех случаев.
Это не будет работать при приведении значения и присвоении. Вы должны привести контроллер в действие во время передачи данных. Подобный этому
(viewController as? QuotesTestmoniesViewController).viewType = ViewType.Quotes
Вы можете создать универсальную функцию для нажатия контроллера вида, как это
func pushNextViewController<T: UIViewController>(viewController: T) {
self.navigationController?.pushViewController(viewController, animated: true)
}
Использование :
let viewController = self.amiStoryboard.instantiateViewController(withIdentifier: "militaryquotestestmoniescontroller") as! QuotesTestmoniesViewController
viewController.viewType = ViewType.Quotes
pushNextViewController(viewController: viewController)
//----
let viewController2 = self.amiStoryboard.instantiateViewController(withIdentifier: "militarysaintscontroller") as! SaintsViewController
pushNextViewController(viewController: viewController2)
Комментарии:
1. Мне понравилось использование общих функций здесь. Я вызвал функцию после инструкции switch один раз.
Ответ №2:
Переменная типа T может содержать значения типа T. Не имеет значения, если вы делаете что-то вроде присвоения ее с помощью выражения, в котором вы приводите T к U. Все равно переменная типа T.