2011-04-08 105 views
8

我想添加一个uiviewcontroller的视图,它有一个按钮和几个标签作为uitableviewcell的内容视图。如何将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. 添加的看法,对此有一个按钮,并通过 的视图 - 控制

  2. 如何确保存储处理一个UITableView细胞 被释放 当视图超出范围?

TIA, 普利文

+0

发表一些崩溃日志避免这种情况。检查您的控制台。 – 2011-04-08 15:52:39

回答

1

我认为问题是,你是释放控制器,只是使用由它的父保留的子视图。行动模式需要一个我认为是释放控制器的目标。为什么你应该释放你的viewController如果你只需要它的视图?保留它并通过一个属性对它进行引用。

我向子表视图单元格添加子视图的方法将在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可以很容易地实现。

您保证使用UIViewControllerviewDidUnload方法和dealloc方法释放内存。

+0

只有当我不释放控制器时,才会调用uiview上的按钮动作。如果我必须进行高效的内存管理,控制器如何获得按钮单击事件? – 2011-04-08 14:16:55

+0

谁说释放控制器是有效的内存使用,如果你需要它?如果内存不足,当前控制器将收到内存警告。这将触发卸载视图。 – 2011-04-08 14:19:29

+0

我不释放控制器。但是我希望控制器的(IBAction)被调用,并且当tableview被释放时控制器的dealloc被调用。它并没有在我的情况下被调用。 – 2011-04-08 14:38:47

1

“按钮操作导致崩溃” - 按下按钮时会发生什么事故?另外,你似乎只使用MyViewController的视图(因为你将视图添加到单元中,然后释放控制器) - 除了包含视图之外,该控制器应该做什么?为什么不只是使用视图?

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

1

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

我们可以通过维持强大的参考控制器

@Property(nonatomic,strong)MyViewController *controller; 

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

[self addChildViewController:controller]; 
+0

如何在swift中做到这一点? – 2016-04-12 08:56:54

+0

好吧我正在做'让someVC = SomeViewController.init(..)'在视图内部完成单元的加载,将'someVC'放在'viewdidload'之外作为'var someVC:SomeViewController?',然后在视图中初始化它,参考。 可能会帮助别人 – 2016-04-12 09:09:09

相关问题