2011-11-09 126 views
0

我有一個超級視圖,我添加一個子視圖進行選擇。在superview(主視圖)中,我執行以下操作: [self.view addSubview:cityViewController.view];ios超級視圖和子視圖

在cityView中,當我完成了我需要做的事情之後,我只是做了 self.view removeFromSuperView。

問題是,從超視圖內,我怎麼能告訴子視圖何時已經刪除自己。

回答

3

有幾種方法,但誠實地說,因爲當前的視圖控制器(我們稱之爲主)只是添加cityViewController的視圖,保持添加/刪除視圖到當前視圖控制器的處理,並且只需要主控制器調用[cityViewController.view removeFromSuperView]

通過這種方式,您可以在接收到此通知時執行任何您想要的代碼(無論是觸發方法還是UINotification)。

- 編輯樣品UINotification代碼 -

的main.m

... 
//Define cityViewController as an iVar and alloc/init it 
[[UINotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishView:) name:@"DidFinishView" object:nil]; 
[self.view addSubview:cityViewController.view]; 
... 

-(void) didFinishView:(NSNotification *)notification { 
    [cityViewController.view removeFromSuperView]; 
} 

CityViewController.m

-(IBAction) doneButtonClick:(id) sender { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DidFinishView" object:nil]; 
} 
+0

但我該如何處理由cityview發生的事件導致的父視圖上的事件 – Jesse

+0

再次,有幾種方法可以做到這一點。其中最簡單的就是使用UINotification。我會將代碼添加到我的答案中來演示。 – Geekswordsman

0

簡單的回答是你的觀點不應該自行消除。視圖通過對象間通信機制將用戶交互傳達給相關控制器是更好的做法。最常見的方法是直接消息傳遞,協議和通知。 iOS框架使用所有這些,並且有很好的文檔解釋它們。這裏有一個小結:

  • 直接消息。當一個對象需要與一個已知類型的特定對象進行通信時使用它。例如,如果MyView始終包含在MyViewController中,並且需要向其發送消息,則可以將屬性添加到MyView類中,該類保留指向特定MyViewController對象的指針。然後,您可以通過[myView.myViewController userDidTapSaveButton]或其他任何方式將消息從myView發送到myViewController

  • 協議。一個協議定義了一個對象之間的契約,除了他們遵守契約之外,他們對彼此都不瞭解。例如,UITableView知道它的委託符合UITableViewDelegate協議,它可以將所需的協議消息發送給它的委託。任何對象都可以符合UITableViewDelegate協議。

  • 通知。通知允許對象通過其他對象可以觀察和響應的中央機制(NSNotificationCenter)發佈通知。當發佈通知的對象不知道或關心哪些對象正在觀察它的通知時,通知很有用。

我會閱讀相關文檔和其他關於這些方法的SO &。我還會研究一下MVC(模型/視圖/控制器)設計模式,以便您更加清楚知道應用邏輯的位置。一般來說,視圖只應負責顯示(根據控制器設置的屬性),觀察/響應用戶操作,並通知其控制器執行相關操作。

相關問題