有一種方法可以從UIView
對象獲取視圖控制器引用?我需要的是這樣的:如何通過代碼從UIView獲取UIViewController
MyParentViewController *myParentViewController = [self.view.superview controller];
有一種方法可以從UIView
對象獲取視圖控制器引用?我需要的是這樣的:如何通過代碼從UIView獲取UIViewController
MyParentViewController *myParentViewController = [self.view.superview controller];
可以使用-nextResponder
方法來做到這一點。據http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/nextResponder「的UIView通過返回管理它的UIViewController對象實現此方法(如果有的話),或者它的父(如果它不)」
的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;
...
你的答案非常感謝! – reinaldoluckman 2010-03-02 23:27:18
請查看關於-nextResponder的回答。 – 2012-06-22 19:51:42
你不該救的參考視圖控制器它可能會動態變化。 每次需要時遍歷響應者鏈。
您可以使用
[(MyParentViewController *)[[self.view superview] nextResponder] doSomething];
文檔說「UIView通過返回管理它的UIViewController對象(如果它有一個)或它的超級視圖(如果沒有)來實現此方法;」。因此,如果視圖嵌套得很深,nextResponder將簡單地返回它的超級視圖的超視圖(不是控制器),從而導致錯誤(未知選擇器)。另一方面,如果視圖是控制器的視圖,它可以返回另一個控制器(例如控制器在navigationController中,因此控制器的父視圖是navigationController的視圖,nextResponder將返回navigationController)。所以這就是爲什麼我低估了 – JakubKnejzlik 2014-05-23 01:58:29
您可以使用以下方法:
UIViewController* yourViewController =
(UIViewController*)[(YourAppDelegate*)
[[UIApplication sharedApplication] delegate] viewController];
這是一個很好的解決方法,但視圖永遠不需要直接訪問其控制器。這就是我們有代表的原因。 – Sulthan 2014-02-28 11:10:15