我的印象是在视图中添加子视图是这样的:
UITableViewController *sitesel = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped];
sitesel.view.frame = CGRectMake(0,0,100,100);
[self.left addSubview:sitesel.view];
[sitesel release];
但似乎我不应该发布sitesel(控制器)? 所以,我应该发布视图或者什么,我已经保留了一段时间之前保留的东西,但它已经滑落了。 (要使用TableView,你必须将UITableViewController子类化吗?)
(self.left是self.view的子视图,添加在笔尖中)
答案 0 :(得分:1)
addSubview
确实保留了视图,这不是问题所在。您的问题是视图的控制器稍后消失。
你不应该发布视图,因为这不关你的事。你没有创建它,你没有碰它。别管它了。
为了保持工作正常,它需要保持与有效控制器的连接。因此,你不能释放控制器,但要保持它。添加像@property(retain) UITableViewController *siteController;
这样的属性,然后在释放控制器之前执行self.siteController = sitesel;
。这样一切都留在了记忆中。
PS:为了清洁,您应该更改sitesel访问者中的视图。只是为了确保它始终来自控制器。然后,您的方法会更短,只需设置控制器。
ADDED:该setter可能看起来像这样,要求您只设置控制器并透明地更新视图:
- (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正常工作。这简单得多了!