Подкласс UITableViewController не будет запускать didSelectRowAtIndexPath, когда он содержится в подпредставлении, как я могу это исправить? - PullRequest
0 голосов
/ 22 марта 2012

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

фон: Я пытаюсь вложить представления, чтобы разбить раскадровку, которая должна использоваться несколькими разработчиками. Чтобы достичь этого с минимальным дублированием функциональности, я / мы создали mainStoryboard, который содержит контроллер вкладок и 4 вкладки, каждая вкладка содержит подпредставление, которое загружает UIView (содержащийся в другой раскадровке) в себя. Эти представления добавляются так:

//Add sub view
UIStoryboard *board = [UIStoryboard storyboardWithName:@"MessagesStory" bundle:nil];
UIViewController *boardController = [board instantiateInitialViewController];

[self.view addSubview:boardController.view];
boardController.view.frame = CGRectMake(0, 0, 320, 480);

Начальный загруженный контроллер представления является подклассом UITableView, все это прекрасно работает для отображения таблицы и ее содержимого на экране, и я могу взаимодействовать с таблицей и выбирать строки, однако прослушиватель событий на контроллере представлений «didSelectRowAtIndexPath» не срабатывает.

Я знаю, что он не стреляет благодаря доброму старому NSLog ():

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Please kind sirs help a poor string appear in the console.");

}

Я знаю, что это связано с подпредставлением, потому что, если я загружаю подпредставление самостоятельно в качестве основного представления, прослушиватель событий функционирует должным образом.

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

1 Ответ

1 голос
/ 23 марта 2012

Я понял это.

Это было потрясающе просто, но мне пришлось немного почитать, чтобы найти ответ.Все мои поиски, где я нашел учебники и примеры «addSubView», о которых я даже не знал, «addChildViewController» существовали.

В любом случае, я считаю, что это так просто:

-(void)viewDidAppear:(BOOL)animated
{
    if (firstLaunch) {    
            firstLaunch = NO;

            //Find the view controller in the other storyboard
            UIStoryboard *board = [UIStoryboard storyboardWithName:@"MessagesStory" bundle:nil];
            UIViewController *boardController = [board instantiateInitialViewController];

            //add it as a child view controller (THIS IS WHAT I WAS MISSING)
            [self addChildViewController:boardController];

            //now it is okay to add the subview
            [self.view addSubview:boardController.view];

            //trigger this method (also missing this but it will run without it, I assume is good practice)
            [boardController didMoveToParentViewController:self];
    }

    [super viewDidAppear:animated];
}

Однажды я понял, что хочу«addChildViewController» было легко найти информацию:

Как работает View Controller Containment в iOS 5?

Разумно ли «вкладывать» UIViewControllers внутридругие UIViewControllers, как вы бы UIViews?

...