在子视图控制器中的UITableView委托
我有一个UIViewController
调用父 ,并有一个UIView
子视图中的父 。 我想添加两个不同的可能的UIViewControllers
,称为A和B作为父的子视图。 A是一个带有UITableView
的UIViewController
。 我将A的UITableView
的datasource
和delegate
设置为A。
然后,我可以“成功”地将A添加到父项 ,为A设置数据如下:
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作为行。
我的问题:当我尝试滚动tableview,它崩溃。 当我尝试select一个单元格时,出现以下exception:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIAppearanceCustomizableClassInfo tableView:didSelectRowAtIndexPath:]: unrecognized selector sent to instance 0x78c64430'
由于AViewController
在上面的代码中是在本地声明的,因此只要代码完成,它就会被释放。 所以,当你触摸滚动/select,委托/数据源方法被调用时, delegate
和datasource
指向一个完全不同的对象(或根本没有)。 因此你的崩溃。
此外,在实现客户容器视图时,您需要实现父母和孩子都知道的一些代码。 在Apple Docs中查看“实现自定义容器视图控制器”:
[self addChildViewController:vc]; [self.container addSubview:vc.view]; [vc didMoveToParentViewController:self];
我相信addChildViewController
也将提供一个强大的引用从父( vc
),从而防止它被解除分配。 所以上面的代码也应该修复解除分配的问题。