0

У меня есть, может быть, немного нетрадиционный вопрос. Я работаю над приложением, которое имеет два разных основных объекта данных (сеансы и подпрограммы). Впоследствии у меня есть два разных контроллера представлений в построителе интерфейса, чтобы заполнить атрибуты этих объектов. Дело в том, что эти два объекта идентичны, кроме того, что мне нужны сеансы, чтобы иметь отношение много к одному с объектом и подпрограммами клиентов, чтобы не иметь никаких отношений.Программно изменяемый класс контроллера вида просмотра (быстрый)

Вопрос в том, что. Id нравится использовать один и тот же контроллер представления в построителе интерфейса для моего сеанса и классов подпрограмм, есть ли способ, с помощью которого я могу программно определить, на какой класс назначен конструктор представлений интерфейса, на основе идентификатора segue? Я знаю, что это должно быть какое-то заявление if segue.identifier == "myIdentifier" { /*code for changing destination view controller's class*/}, но я не уверен, что будет с кодом, и я также хочу услышать другие предложения о том, как это сделать более эффективно.

Спасибо!

+0

Это звучит из вашего описания, как будто сеанс может быть реализован как подкласс класса. В этом случае ваш контроллер просмотра должен будет иметь дело с отображением подпрограммы, даже если ему был дан дочерний объект (сеанс) для работы. –

+0

Невозможно изменить класс контроллера представления назначения, созданный с помощью segue. Но почему бы не закодировать контроллер своего вида, чтобы он мог принимать либо сеанс, либо обычный объект как свойство (легко, если, как предлагает @PhillipMills, вы делаете один подкласс другого). – pbasdf

ответ

0

Контроллер вида в вашей раскадровке является заархивированным объектом определенного класса, и вы не можете просто назначить его другому классу. (Так же, как если у вас есть String объект и хотите присвоить ему быть Int не будет хорошо работать)

Вы можете проверить destinationViewController свойство Segue в prepareForSegue:, если это определенный класс, как это:

if let dvc = segue.destinationViewController as? MyExpectedVC { 
    // do something 
} 

но это, вероятно, не то, что вы хотите/должны делать.

Я бы согласился с тем, что говорили комментаторы вашего вопроса, и предположил бы, что ваш класс контроллера вида реализует метод конфигурации для обеих моделей. Либо отдельный для каждого класса, как это:

func prepareWithSession(session: Session) {/* ... */} 
func prepareWithRoutine(session: Routine) {/* ... */} 

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

func prepareWithDisplayable(session: DisplayableType) {/* ... */} 

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

В контроллере представления вы можете создать пользовательскую логику, которая отображает некоторые поля только для определенных типов. (например, скрыть виды, скрытые для других типов)

Смежные вопросы