子 Viewcontroller 中的 UITableView 委托

UITableView Delegate in Sub Viewcontroller

我有一个 UIViewController 调用 Parent,我在 Parent 中有一个 UIView 子视图。我想添加两个不同的可能 UIViewControllers 之一,称为 AB,作为 Parent[ 的子视图=41=]。 AUIViewControllerUITableView。我将AUITableViewdatasourcedelegate设置为A

然后我可以 "successfully" 添加 AParent,设置 A[= 的数据41=]如下:

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

我所说的成功是指我在表格视图的单元格中看到了正确的数据。即 foo、bar 和 baz 作为行。

我的问题: 当我尝试滚动表格视图时,它崩溃了。当我尝试 select 一个单元格时,出现以下异常:

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

因为 AViewController 是在上面的代码中本地声明的,所以它会在该代码完成后立即被释放。因此,当您触摸 scrolling/selection 并调用 delegate/datasource 方法时,delegatedatasource 指向一个完全不同的对象(或 none )。因此你的崩溃。

此外,在实现客户容器视图时,您需要实现一些代码,以便父子都知道。看看 Apple Docs 中的 "Implementing a Custom Container View Controller":

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

我相信 addChildViewController 也会提供从父对象到子对象 (vc) 的强引用,从而防止它被释放。所以上面的代码应该也解决了释放问题。