Может ли ViewController быть универсальным, который содержит IBOutlets и т. Д.? - PullRequest
0 голосов
/ 23 февраля 2019

Может ли мой viewcontroller быть универсальным и все еще содержать IBOutlet?

class AViewController<T> : SuperViewController, Decodable where T : Decodable {

    @IBOutlet weak var leftButton: UIButton!
    @IBOutlet weak var rightButton: UIButton!

    var pop : T?

}

будет ли работать эта реализация?это бросает мне ошибку.Тип AViewController не соответствует декодируемым. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Контроллеры представления, содержащие IBOutlet s, являются контроллерами представления, которыми вы будете управлять в Интерфейсном Разработчике.С этим сталкиваются две проблемы:

  1. Контроллер представления Interface Builder создается с использованием необходимого инициализатора init(coder:), который не может создавать экземпляры универсальных объектов, поскольку у него нет контекста.в котором он знает, что T должно быть во время выполнения.

  2. Когда вы создаете экземпляр AViewController в коде, вы будете указывать конкретный тип

let aVC = AViewController<String>()

но вы не можете сделать это в Identity Inspector в IB.Это недопустимо:

enter image description here

То, что вы можете сделать, это создать специальный контроллер представления раскадровки, который наследуется от вашего универсального контроллера представления, но указывает конкретный тип

class AStringViewController: AViewController<String> {
}

И используйте AStringViewController в IB в инспекторе удостоверений и подключите розетки, как требуется.

Если вы обнаружите, что это не совсем то, что вам нужно, и ваш контроллер представлениядолжен быть более динамичным, чем вы должны будете создать свой контроллер представления в коде, и вы не сможете использовать розетки.

Другая альтернатива - иметь не универсальный контроллер представления с вашими розетками и использовать дочернее представлениеконтроллеры, созданные в коде и имеющие необходимые вам дженерики.

0 голосов
/ 23 февраля 2019

Просто удалите , Decodable.Нет никаких оснований указывать, что сам класс контроллера представления соответствует Decodable.

Ваша ошибка исчезла с:

class AViewController<T> : SuperViewController where T : Decodable {
    @IBOutlet weak var leftButton: UIButton!
    @IBOutlet weak var rightButton: UIButton!

    var pop : T?
}

Это полностью независимо от того, почему вы также заявляете, чтоT должно быть Decodable.Это совершенно отдельный вопрос, на который я не собираюсь отвечать.

...