2015-02-14 5 views
1

У меня есть UIViewController вызова Родителя, и у меня есть UIView подвида внутри Родителя. Я хочу добавить один из двух возможных вариантов: UIViewControllers, A и B, as subviews of Родитель. A - UIViewController с UITableView. Я установил datasource и delegate из UITableView в A - A.UITableView Делегат подраздела ViewController

Затем я могу «успешно» добавить к Родитель, устанавливая данные для следующим образом:

AViewController *vc = (AViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"A"]; 
    NSMutableArray *data = [@[@"foo",@"bar",@"baz"] mutableCopy]; 
    vc.posts = data; 
    [self.container addSubview:vc.view]; 

успешным, я имею в виду, что я вижу TableView с правильными данными в клетках. А именно foo, bar и baz как строки.

Моя проблема: Когда я пытаюсь прокрутить табличное изображение, он падает. При попытке выбрать ячейку, я получаю следующее исключение:

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[_UIAppearanceCustomizableClassInfo 
tableView:didSelectRowAtIndexPath:]: unrecognized selector sent to instance 0x78c64430' 

ответ

2

Поскольку AViewController объявлена ​​локально в коде выше, он удаляется, как только что код завершения. Поэтому, когда вы касаетесь прокрутки/выбора и вызываете методы делегата/источника данных, delegate и datasource указывают на совершенно другой объект (или вообще ничего). Отсюда ваша авария.

Кроме того, при реализации представлений контейнера клиента вам необходимо реализовать некоторый код, который знает как родитель, так и ребенок. Посмотрите на «Реализация пользовательского контейнера View Controller» в Apple Docs:

[self addChildViewController:vc]; 
    [self.container addSubview:vc.view]; 
    [vc didMoveToParentViewController:self]; 

Я считаю, что addChildViewController также обеспечит сильную ссылку от родителя к ребенку (vc), тем самым предотвращая его освобождаться. Таким образом, приведенный выше код должен также устранить проблему освобождения.

+0

это работает! теперь, есть ли что-нибудь особенное, что мне нужно сделать, если у A есть навигационный контроллер, прикрепленный к нему? – Apollo

+0

Если контроллер просмотра A встроен в контроллер навигации в вашем раскадровке, вы должны создать экземпляр самого контроллера навигации (например, 'UINavigationController * navCtrl = (UINavigationController *) [self.storyboard instantiateViewControllerWithIdentifier: @" Nav "];'), а затем используйте свойство 'topViewController', чтобы получить ссылку на vc A (например,' AViewController * vc = (AViewController *) navCtrl.topViewController; '). Затем вы можете установить 'data' на vc A и добавить' navCtrl.view' в свой вид контейнера. – pbasdf

Смежные вопросы