2010-08-06 26 views
0

我正在尋找一種聰明的方式來刪除子視圖(與removeFromSuperview)當子視圖本身(或其中的一個組成部分)觸發刪除。對於源代碼,這將是像如何從一個組件觸發時刪除子視圖?

UIView * sub_view = [[[UIView alloc] initWith... 

UIButton *button = [UIButton buttonWithType... 

[sub_view addSubview:button]; 

[self.view addSubview:sub_view]; 

如果按鈕現在有這樣的事情

[button addTarget:self action:@selector(closeMySubview) forControlEvents:UIControlEventTouchUpInside]; 

closeMySubviewremoveFromSuperview呼叫沒有工作,但結果SIGABRT和無法識別的選擇發送到實例。 ..。那麼有沒有更多的東西不再是一個驚喜,但什麼是正確的方式?

(如果從另一個GUI組件觸發會工作的原因,但這裏是不是點刪除子視圖。)

回答

0

這種類型的行爲的最佳模式是「委託」模式。

您可以從任何類繼承並添加此屬性:

@property (assign) id delegate; 

的實例變量:

id delegate; 

而且,像這樣定義一個協議:在

@protocol MySubViewDelegate 

    -(void)myViewDidFinish:(UIView *)view; 

所以你視圖控制器,你可以實例化子視圖,告訴它你的委託,並將它添加到視圖中。然後,在子視圖的操作調用該方法:

[delegate myViewDidFinish:self]; 

的視圖控制器然後可以這樣說:

[view removeFromSuperView]; 
+0

這起作用。我認爲關鍵是導致removeFromSuperview的調用必須來自應該刪除的相同視圖?! – georgij 2010-08-08 16:52:53

+0

是的,這在邏輯上最有意義。我喜歡這樣想: 假設我給你看了一隻手錶。你看看它,然後決定你完成了。誰的工作是將手錶放在我的手錶或手錶上? 在這種情況下,視圖向您展示了一些東西。因此,應該如何以及何時放棄! – DexterW 2010-08-09 00:46:32

0

它應該工作。

檢查您的子視圖是否指向現有的視圖。

發佈啓動的整個代碼和removeFromSuperview

+0

是的,這聽起來像有一個在closeMySubview的編碼錯誤。 – 2010-08-06 21:45:05

相關問題