2011-04-08 467 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

相關問題