Я думаю, вы можете добраться туда, добавив (пустое) расширение к UIViewController
, а затем указав свой атрибут detailViewController
, используя составленный протокол пустого расширения и ваш DetailViewController
. Например:
protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}
Теперь все подклассы UIViewController
удовлетворяют протоколу UIViewControllerInject
. Тогда с этим просто:
typealias DetailViewControllerComposed = protocol<DetailViewController, UIViewControllerInject>
class MasterViewController : UITableViewController {
var detailViewController : DetailViewControllerComposed?
// ...
}
Но это не особенно «естественно».
=== Edit, Дополнение ===
Фактически , вы можете сделать это немного лучше, если вы определите свой DetailViewController
, используя мой предложенный UIViewControllerInject
. Например:
protocol UIViewControllerInject {}
extension UIViewController : UIViewControllerInject {}
protocol DetailViewController : UIViewControllerInject { /* ... */ }
, и теперь вам не нужно явно что-то компилировать (мой DetailViewControllerComposed
) и использовать DetailViewController?
как тип для detailViewController
.
Одним из возможных решений, которое я также пробовал, было отключение функции «Быстрый запуск». Перейти к Файл -> Настройки -> Построение, выполнение, развертывание -> Мгновенный запуск -> Снимите флажок для мгновенного запуска .
Очистите свой проект перед запуском на вашем устройстве.
Редактировать
Обязательно включите опцию multidex , если ваше приложение и библиотеки, на которые оно ссылается, превышают ограничение в 65 тыс. Методов . Для поддержки мультидекса в сборке Gradle добавьте зависимости
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
А в defaultConfig добавьте multiDexEnabled
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
Для получения дополнительной информации о мультидексе, пожалуйста, посетите ссылку разработчика Android [118 ]
Это просто проблема Android IDE, мы можем игнорировать это.