Как разделить одну сцену раскадровки между несколькими 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/...