2010-03-02 24 views

回答

16

可以使用-nextResponder方法來做到這一點。據http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/nextResponder「的UIView通過返回管理它的UIViewController對象實現此方法(如果有的話),或者它的父(如果它不)」

+4

這是一個很好的解決方法,但視圖永遠不需要直接訪問其控制器。這就是我們有代表的原因。 – Sulthan 2014-02-28 11:10:15

5

的UIView沒有通過default.You參考的UIViewController可以將其添加到您的UIView子類,並設置它,當你在UIViewController中創建的UIView。

如果你正在尋找viewcontroller的父級,每個UIViewController的屬性爲parentViewController,但是如果你想從UIView訪問這個,你需要先到你的UIViewController。

你可以看到例如如何在您的UIView的子類,以及如何/在哪裏把它架在View Controller Programming guide for iPhone創建參考UIViewController中,見創建視圖編程定義自定義視圖控制器類,在這裏就是這樣的例子,更多的細節請看節拍器的例子。

- (void)loadView { 

    self.wantsFullScreenLayout = YES; 

    MetronomeView *view = [[MetronomeView alloc] 
          initWithFrame:[UIScreen mainScreen].applicationFrame]; 
    view.metronomeViewController = self; 
    self.view = view; 
    self.metronomeView = view; 

    [view release]; 
} 

在標題:

@interface MetronomeView : UIView { 
    MetronomeViewController *metronomeViewController; 
... 
+0

你的答案非常感謝! – reinaldoluckman 2010-03-02 23:27:18

+1

請查看關於-nextResponder的回答。 – 2012-06-22 19:51:42

1

你不該救的參考視圖控制器它可能會動態變化。 每次需要時遍歷響應者鏈。

2

您可以使用

[(MyParentViewController *)[[self.view superview] nextResponder] doSomething]; 
+0

文檔說「UIView通過返回管理它的UIViewController對象(如果它有一個)或它的超級視圖(如果沒有)來實現此方法;」。因此,如果視圖嵌套得很深,nextResponder將簡單地返回它的超級視圖的超視圖(不是控制器),從而導致錯誤(未知選擇器)。另一方面,如果視圖是控制器的視圖,它可以返回另一個控制器(例如控制器在navigationController中,因此控制器的父視圖是navigationController的視圖,nextResponder將返回navigationController)。所以這就是爲什麼我低估了 – JakubKnejzlik 2014-05-23 01:58:29

1

您可以使用以下方法:

UIViewController* yourViewController = 
         (UIViewController*)[(YourAppDelegate*) 
         [[UIApplication sharedApplication] delegate] viewController]; 
相關問題