Проблема с передачей данных в UIViewController iOS

#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.