如何将uiviewcontroller的视图作为内容视图添加到uitableviewcell?

时间:2011-04-08 14:04:06

标签: iphone objective-c uitableview

我想添加一个uiviewcontroller的视图,它有一个按钮和几个标签作为uitableviewcell的内容视图。

虽然我可以添加,但按钮操作会导致崩溃。

MyViewController *controller = [[MyViewController alloc] initwithnibname:@"MyView" bundle:nil];
[cell.contentview addsubview:controller.view];
[controller release]; // if i comment out this part the button action is received by my view controller.

但是从视图中删除时会出现内存泄漏。不调用myviewcontroller的dealloc。

这样做的正确方法是什么?

  1. 将视图添加到uitableview单元格 它有一个按钮,由处理 viewcontroller

  2. 如何确保释放内存 当视图超出范围时?

  3. TIA, Praveen

3 个答案:

答案 0 :(得分:1)

我认为问题是,您正在释放控制器并且只使用其超级视图保留的子视图。动作模式需要一个我认为是已释放控制器的目标。如果你只需要它的视图,你为什么要发布你的viewController?保留它并通过属性保持对它的引用。

我将子视图添加到tableview单元格的方法是在UITableViewCell的子类中。假设你有一个UITableViewCell的子类,比如ButtonTableViewCell。单元格的init创建并向您的单元格添加一个UIButton,并将其很好地放入其contentView中。 Decalre引用该按钮的属性。像UIButton *myButton一样。在cellForRowAtIndexPath中应该做什么是这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ButtonTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyButtonCell"];           
    if (cell == nil) {
        cell = [[ButtonTableViewCell alloc] initWithReuseIdentifier:@"MyButtonCell"];
    }
    [cell.myButton addTarget:self action:@selector(onDoSomething) forControlEvents:UIControlEventTouchUpInside];

    // Do more cell configuration...
    return cell;
}

我已经编写了初始化程序initWithReuseIdentifier,可以轻松实现。

您可以使用viewDidUnloadUIViewController方法和dealloc方法确保释放内存。

答案 1 :(得分:1)

“按钮操作导致崩溃” - 点击按钮时崩溃是什么?

此外,您似乎只使用MyViewController的视图(因为您将视图添加到单元格然后释放控制器) - 除了包含视图之外,该控制器应该做什么?为什么不直接使用视图?

另外,(在这里疯狂猜测)按钮的通常构造函数没有new / alloc / copy,因此不保证发布。我看到很多代码因不恰当地发布UIButton而崩溃。

答案 2 :(得分:1)

将控制器视图作为subview添加到任何其他视图不会保留控制器。 在释放调用之后立即释放控制器,并且任何按钮操作将被发送到解除分配的实例。

我们可以通过保持对控制器的强引用来避免这种情况

@Property(nonatomic,strong)MyViewController *controller;

或通过添加视图控制器作为 ChildViewController

[self addChildViewController:controller];