Разделите диспетчер просмотра раскадровки между несколькими подклассами
У меня та же проблема, что и 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";
}
}
Это довольно ограниченно, так как вы делитесь сценой раскадровки и нет подкласса сцены. Например, вам нужно было бы скрыть элементы, а затем отобразить их, если они были созданы с использованием определенного подкласса. Другой способ сделать это - установить логическое значение для одного класса в зависимости от того, откуда вы переходите, и затем записывать условный код. Этот последний способ можно рассматривать как немного запаха кода, но это лучше, чем дублирование раскадровки, что, вероятно, очень плохая идея.