addSubview
确实能保留的观点,这不是问题。你的问题是视图的控制器稍后会消失。
您不应该发布视图,因为这不关你的事。你没有创造它,你没有触及它。不要管它。
为了保持正常工作,它需要保持连接到一个有效的控制器。因此,您不得释放控制器,但请保持它。在释放控制器之前添加一个属性,如@property(retain) UITableViewController *siteController;
,然后执行self.siteController = sitesel;
。这样一切都留在记忆中。 PS:为了保持清洁,您应该更改sitesel的访问器中的视图。只是为了确保它总是来控制器。然后,您的方法会变得更短,只需设置控制器即可。
新增:这二传手能像她那样,要求您仅设置控制器和视图被透明的更新:然后
- (void)setSiteselController:(UITableViewController *)ctrl {
if (_sitesel)
[_sitesel.view removeFromSuperview];
[_sitesel autorelease];
_sitesel = [ctrl retain];
if (_sitesel) {
_sitesel.view.frame = CGRectMake(0,0,100,100);
[self.left addSubview: _sitesel.view];
}
}
您的原始代码将收缩到这么多的清洁版本:
UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle: UITableViewStyleGrouped];
self.siteselController = sitesel;
[sitesel release];
PPS:你不需要需要 UITableView工作的控制器。这简单得多!
对不起,你可以扩展你的PS,我不太明白。但是我不需要再次访问UITableViewController,从这一点开始的所有事情都是在TableViewController中完成的。 – 2010-08-30 13:41:05
您应该重写访问器并在其中添加视图。像这样:'_controller = newController; _controller.view.frame = ... [self.view addSubview:_controller.view];' 你不需要控制器在这里并不重要。如果你不这样做,你必须保留它。你也许可能想在稍后删除/交换该视图。然后,为了不浪费内存,了解控制器是很好的。 – 2010-08-30 13:48:09
对不起,我还是不明白,我没有看到你刚刚发布的代码有任何不同。 – 2010-08-30 20:41:40