Разделите диспетчер просмотра раскадровки между несколькими подклассами

У меня та же проблема, что и Pedro здесь, но не удовлетворен ответом, и поскольку у вас есть уже щедрость и вознаграждение, я создал этот вопрос, и я добавлю щедрость как можно скорее.

Я хочу создать или обработать сегу (выделено желтым цветом) в коде, так что представление "Мастер" представляет собой любое из нескольких подклассов MFMasterViewController (выделено красным цветом).

storyboard illustration

При выполнении этого с помощью Nibs я мог бы создать Nib, SharedNib.xib и установить класс MFMasterViewController, затем создайте мои подклассы, скажем, MFMasterViewControllerSubclassA, MFMasterViewControllerSubclassBи т.д., а затем создать экземпляр какого-либо подкласса, который я хотел использовать...

MFMasterViewControllerSubclassA *controller = [[MFMasterViewControllerSubclassA alloc] initWithNibName:@"SharedNib" bundle:nil];

или...

MFMasterViewControllerSubclassB *controller = [[MFMasterViewControllerSubclassB alloc] initWithNibName:@"SharedNib" bundle:nil];

и др.

Любые подсказки относительно того, как я могу получить это право с помощью раскадровки?

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

Ответ 1

Вы можете просто добавить несвязанные контроллеры представлений в свою раскадровку и дать им идентификаторы. Затем в коде вы можете сделать что-то подобное в своем подклассе контроллера навигации:

MFMasterViewControllerSubclassA *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SubclassA"];
self.viewControllers = @[controller];

Это изменит контроллер корневого контроллера навигационного контроллера на контроллер. Если вы хотите оживить изменение, вы можете использовать setViewControllers: анимированный: вместо этой второй строки.

Ответ 2

Я знаю, что это старый пост, но я думал, что ответю, так как он еще не ответил. Это не сложно. Где бы вы ни хотели ссылаться на свой суперкласс, просто обратитесь к нему с помощью соответствующего подкласса. Подкласс содержит все, что делает суперкласс. Существует несколько способов сделать это в зависимости от того, как вы хотите выполнять свои сеансы. Если вы используете prepareForSegue, сделайте следующее:

  • Создайте сегмент с помощью кнопки или любого другого.
  • Назначьте идентификатор
  • Импортируйте свой подкласс в файл .m
  • В prepareForSegue выполните следующие действия.

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
       {
          if ([segue.identifier isEqualToString:@"YourID"]) {
                SubclassA *subA = segue.destinationViewController; // the file owner in the storyboard is set to the super class
                subA.someString = @"subclass A is setting this";
            }
       }
    

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