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