2013-03-09 3 views
1

Я создаю приложение ipad, где мне нужно показать ChildViewController внутри представления ParentViewController с нижеследующим кодом, который отлично работает.Приложение вылетает при нажатии кнопки chiledviewcontroller

- (void)viewDidLoad 
{ 
    FavViewController *aViewController = [[FavViewController alloc] initWithNibName:@"FavViewController" bundle:nil]; 
    [self.mainView addSubview:aViewController.view]; 
    [super viewDidLoad]; 
} 

Когда favViewController нагрузки в self.MainView родительского зрения все элементы управления внутри childViewController показывает нормально, но когда я нажимаю на UIButton приложение сбой. ниже - журнал для сбоя.

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable myAction:]: unrecognized selector sent to instance 0x8093170' *** First throw call stack: (0x1733012 0x1558e7e 0x17be4bd 0x1722bbc 0x172294e 0x156c705 0x4a02c0 0x4a0258 0x561021 0x56157f 0x560222 0x4cfb1d 0x4cff02 0x4add4a 0x49f698 0x25fddf9 0x25fdad0 0x16a8bf5 0x16a8962 0x16d9bb6 0x16d8f44 0x16d8e1b 0x25fc7e3 0x25fc668 0x49cffc 0x255d 0x2485 0x1) libc++abi.dylib: terminate called throwing an exception

+0

'' - [NSConcreteMapTable myAction:]: непризнанный селектор означает, что где-то у вас есть указатель на NSConcreteMapTable, и вы пытались вызвать его «myAction». Помните, что тип указателя не гарантирует, что объект, на который указывает этот тип, - вы можете очень легко повредить вещи и ввести неправильный тип объекта в указатель. –

+0

Я нашел решение, мне нужно добавить код ниже '[self addChildViewController: aViewController];' – user1997951

ответ

3

Это ошибка управления памятью, вызванные неправильным использованием UIViewControllers.

FavViewController, созданный в вашем -viewDidLoad, не сохраняется и поэтому будет освобожден вскоре после того, как вы покинете этот метод.

Вы создали представление с контроллером, связанное действие с элементами управления внутри этого вида на элементы управления, позволило уничтожить контроллер и затем попытался запустить одно из этих действий, нажав на кнопку.

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

Кроме того, вы ожидаете, что вы не будете произвольно размещать представления, принадлежащие подклассам UIViewController. Если вам нужно это сделать, вы должны использовать методы контроллера контейнера для управления этими дочерними контроллерами. - addChildViewController: является одним из этих методов и, как правило, решает проблему, поскольку контроллер родительского представления теперь сохраняет ссылку на дочерний контроллер, поэтому он не будет освобожден.

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