在子视图控制器中的UITableView委托

我有一个UIViewController调用 ,并有一个UIView子视图中的 。 我想添加两个不同的可能的UIViewControllers ,称为AB作为父的子视图。 A是一个带有UITableViewUIViewController 。 我将AUITableViewdatasourcedelegate设置为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,委托/数据源方法被调用时, delegatedatasource指向一个完全不同的对象(或根本没有)。 因此你的崩溃。

此外,在实现客户容器视图时,您需要实现父母和孩子都知道的一些代码。 在Apple Docs中查看“实现自定义容器视图控制器”:

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

我相信addChildViewController也将提供一个强大的引用从父( vc ),从而防止它被解除分配。 所以上面的代码也应该修复解除分配的问题。