Как разделить одну сцену раскадровки между несколькими UIViewControllers
Я полностью переформулирую этот вопрос, узнав, что я изначально вышел из строя, но не имея возможности приблизиться к решению проблемы. Что касается этого изображения...
![storyboard illustration]()
Я хочу либо создать или обработать сегу (выделено желтым цветом) в коде, так что представление "Мастер" представляет собой любое из нескольких подклассов MFMasterViewController
(выделено красным цветом).
При выполнении этого с помощью Nibs я мог бы создать Nib, SharedNib.xib
и установить класс как MFMasterViewController
, а затем создать мои подклассы, например MFMasterViewControllerSubclassA
, MFMasterViewControllerSubclassB
и т.д., а затем создать экземпляр какого-либо подкласса, который я хотел использовать...
MFMasterViewControllerSubclassA *controller = [[MFMasterViewControllerSubclassA alloc] initWithNibName:@"SharedNib" bundle:nil];
или...
MFMasterViewControllerSubclassB *controller = [[MFMasterViewControllerSubclassB alloc] initWithNibName:@"SharedNib" bundle:nil];
и др.
Любые подсказки относительно того, как я могу получить это право с помощью раскадровки?
В моем случае причина для этого заключается в том, что все мои подклассы являются одним и тем же табличным представлением и данными, но отсортированы по-разному и имеют некоторую разницу в том, что написано в подробном тексте cels. Я подозреваю, что это не редкость.
Cheers и TIA,
Педро:)
Ответы
Ответ 1
Это не прямой ответ, но именно так я бы выполнил то, что вы хотите, основываясь на вашем объяснении причины.
В принципе вам нужно отделить UITableViewDataSource
(и, возможно, делегат тоже) от MFMasterViewController
, поэтому, когда выполняется segue, вы можете установить правильный источник данных и делегировать его в контроллере представления.
Итак, в контроллере навигации вам нужно реализовать метод prepareForSegue:sender:
. Здесь вы можете настроить segue до его выполнения:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// you can set the segue identifier using Interface Builder
// also it is a good thing to make sure which segue you're using
if (([segue identifier] isEqualToString:@"TheId"]) {
id<UITableViewDataSource> dataSource = [[TableViewDataSourceImplementationA alloc] init];
[[[segue destinationViewController] tableView] setDataSource:dataSource];
}
}
Таким образом вы можете получить нужную настройку без необходимости создавать подклассы вашего контроллера представления.
И если у вас есть доступ к видео WWDC, проверьте сеанС# 407 Принятие раскадровки в вашем приложении.
Ответ 2
Для тех, кто наткнулся на этот вопрос, вы также должны более широко использовать шаблон "Стратегия" в качестве альтернативы подклассификации вашего контроллера. Принятый ответ - это та форма, в которой реализуемая стратегия исходит из любого источника данных/делегата и может быть отключена во время выполнения. Другим примером этого является fooobar.com/questions/374539/...
Ответ 3
Если ваш .m файл не связан ни с одной раскадрой, не будет ли self.storyboard быть Nil?
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
@"MainStoryboard" bundle:[NSBundle mainBundle]];
ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HauptMenu"];
Обязательно измените раскадровкуWithName: независимо от того, назовите название своей раскадровки.
NSString * storyBoardName;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
storyBoardName = @"MainStoryboard_iPad";
} else {
storyBoardName = @"MainStoryboard_iPhone";
}
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
storyBoardName bundle:[NSBundle mainBundle]];
ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HauptMenu"];
Ответ 4
Я верю, что наконец нашел ответ. Мы хотим использовать раскадровку ViewController с другим именем класса. Существует много обходных решений, таких как использование делегатов, но я думаю, что это лучший вариант. Я уже ответил на это в другой теме. Надеюсь, поможет!
fooobar.com/info/64836/...