2011-02-22 26 views
1

我有基於視圖的應用程序,並且我想調用superview(parentview)中的方法時,它的子視圖被從中刪除。 1)兩個(父,子)視圖是UIViewController的子類 2)添加子視圖爲[self.view addSubview:subviewController]; 3)我通過[self.view removeFromSuperview]從父級刪除子視圖;iPhone如何從它的子視圖調用父視圖中的方法

任何人都可以幫助我。

回答

4

您對術語似乎有點困惑。 UIViews和UIViewControllers是獨立的東西。視圖控制器具有視圖。視圖可以知道何時從視圖中刪除了某些內容,但在這種情況下,您希望視圖控制器知道何時從其視圖中刪除了某些內容?

沒有對程序中的類層次結構做任何其他的假設,我能想到的最好的辦法是創建一個自定義的子類UIView,它將視圖控制器保留爲委託,並在需要刪除某些東西時通知它。將其中的一個用作父視圖,並將父視圖控制器作爲委託。

當父視圖控制器獲取消息時,它會將要刪除的視圖與屬於子視圖控制器的視圖進行比較。如果他們匹配,那麼你有你想要的。

例UIView子類,接口:

@protocol UIViewThatNotifiesViewControllerDelegate 
- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview; 
@end 

@interface UIViewThatNotifiesViewController: UIView 
{ 
    UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate; 
} 

@property (nonatomic, assign) UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate; 
@end 

實現:

@implementation UIViewThatNotifiesViewController 

@synthesize delegate; 

- (void)willRemoveSubview:(UIView *)subview 
{ 
    [delegate view:self willRemoveSubview:subview]; 
    [super willRemoveSubview:subview]; 
} 

@end 

假設你的父視圖控制器的當前視圖的類型的UIView,改變它(在界面生成器和在Xcode)是UIViewThatNotifiesViewController類型。聲明您的視圖控制器實現了UIViewThatNotifiesViewController協議以避免編譯器警告。然後加入像這樣的視圖控制器:

- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview 
{ 
    if(subview == subviewController.view) 
    { 
     NSLog(@"his view is in the process of being removed"); 
    } 
} 

的風格上更正常的方式做這樣的事情是讓每個視圖控制器管理整個畫面充滿了信息。所以你不要把視圖從一個添加到另一個。相反,您使用presentModalViewController:將控制權從一個控制器傳遞給另一個控制器,並且dismissModalViewController:將其傳回(通常使用[self.parentViewController dismissModalViewController:...],以便孩子可以自行解散,而不管其父母是什麼)。然後,您可以使用視圖控制器方法viewWillAppear,viewDidAppear,viewWillDisappear和viewWillAppear來確定您是否即將從可見轉換爲不可見,反之亦然。

+1

很好的答案。我只想補充一點,「讓每個視圖控制器管理整個屏幕」不僅僅是風格問題。 UIViewControllers假設它們填充屏幕,而Apple可以通過它們的容器視圖控制器解決該規則,但不應該嘗試這樣做。嵌套視圖控制器將導致錯誤和意外行爲,並且似乎是新開發人員的常見問題。 – Jonah

+0

嗨,謝謝你的回答,我爲declare協議添加了名爲NotificationDelegate.h的單獨文件,我聲明瞭函數 - (void)通知,並且我聲明瞭id delegate;在子視圖控制器中(具有屬性並在實現類中進行合成),並且我在parentviewcontroller實現類中定義了函數 - (void)通知,但函數 - (vod)通知沒有調用 – Senthil

+0

您需要使用willRemoveSubview:因爲這是方法UIView將調用你自己,你需要重寫。你是否還確保在Interface Builder和Xcode中將視圖設置爲你定義的新子類? – Tommy

相關問題