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

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

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

иллюстрация раскадровки

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

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

or...

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

и т. д.

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

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


person Tieme    schedule 28.11.2012    source источник
comment
вам удалось этого добиться?   -  person Vik    schedule 18.02.2014


Ответы (2)


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

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

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

person rdelmar    schedule 28.11.2012
comment
Да, но каждый viewController может иметь только один идентификатор и один подкласс. Таким образом, невозможно получить подкласс A и подкласс B с помощью instanceiateViewControllerWithIdentifier. - person Tieme; 29.11.2012
comment
@Tieme, ты не хочешь переключить класс, которым должен быть контроллер? У каждого подкласса может быть свой собственный идентификатор, но вам нужен один отключенный контроллер представления для каждого подкласса, который вы пытаетесь создать (если вы хотите, чтобы все это делалось в IB). Это то, чего вы пытаетесь избежать - наличие одной сцены для каждого подкласса? - person rdelmar; 29.11.2012
comment
Я хочу избежать нескольких сцен в IB, мне нужна одна сцена в IB, из которой я могу получить несколько подклассов со всеми подключенными выходами! - person Tieme; 30.11.2012

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

  1. Создайте переход от кнопки или чего-то еще.
  2. Назначьте ему идентификатор
  3. Импортируйте свой подкласс в файл .m
  4. В prepareForSegue сделайте следующее.

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

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

person smileBot    schedule 22.05.2014
comment
Отвечать на старые посты всегда хорошо! Дублирование раскадровки или контроллеров в моей раскадровке было тем, чего я действительно хотел избежать. Я думаю, что понимаю, о чем вы говорите, но я не думаю, что это то решение, которое я искал. Однако я некоторое время не работал над этим проектом. Я вернусь к этому вопросу, когда подниму его снова. А пока кто-нибудь, пожалуйста, проголосуйте, если это сработало для вас. - person Tieme; 23.05.2014