簡體   English   中英

ios超級視圖和子視圖

[英]ios superview and subview

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

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

問題是,從超級視圖內部,我如何知道子視圖何時已將其自身移除。

有幾種方法,但是說實話,由於當前視圖控制器(我們稱其為main)只是添加cityViewController的視圖,保留將視圖添加/刪除到當前視圖控制器的處理,並且只需要主控制器調用[cityViewController.view removeFromSuperView]

這樣,您可以在收到此通知時執行所需的任何代碼(無論是觸發方法還是UINotification )。

-編輯示例UINotification代碼-

主目錄

...
//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];
}

快速的答案是您的觀點不應該被刪除。 通過對象間通信機制將視圖中的用戶交互信息傳達給相關控制器是一種更好的做法。 最常見的方法是直接消息傳遞,協議和通知。 iOS框架使用了所有這些,並且有很多出色的文檔對其進行了解釋。 這是一個簡短的摘要:

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

  • 協議。 協議定義了彼此之間不了解彼此的對象之間的契約,除非它們遵守契約。 例如, UITableView知道它的委托符合UITableViewDelegate協議,並且可以向其委托發送所需的協議消息。 任何對象都可以符合UITableViewDelegate協議。

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

我已經閱讀了有關這些方法的相關文檔以及關於SO的其他問答。 我還將對MVC(模型/視圖/控制器)設計模式進行一些研究,以使您更輕松地知道將應用程序邏輯放在哪里。 通常,視圖僅應負責顯示(基於其控制器設置的屬性),觀察/響應用戶操作並通知其控制器進行相關操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM