2012-07-19 76 views
1

(這應該很簡單,但它已經讓我堅持了很長時間) 我只是試圖從它的UIView中調用一個ViewController方法。從UIView調用父級方法

myViewController聲明並創建一個UIView:

myUIView = [[viewCreator alloc] init…]; 

和我myViewController也有一個方法:

-(void)inABottle{ 
    NSLog(@"Hello."); 
} 

UIView的內部,創建一個UIButton。這個按鈕有一個'選擇器'給一個方法 - 在UIView中 - 然後它試圖在ViewController中調用'inABottle'方法。 UIView的內部:

... 
[myButton addTarget:self action:@selector(isPressed) forControlEvents:UIControlEventTouchUpInside]; 

-(void)isPressed{ 
    [myViewController inABottle];// <<< This is where I have spent my day. 
} 

(在視圖控制器頭文件是#進口版中的UIView。)

會很感激一些幫助。當然,這應該是簡單的!

+1

你在哪裏設置你的UIView myViewController? – 2012-07-19 17:20:34

+0

只需在UIView頭文件中:#import「myViewController.h」 – 2012-07-19 17:22:27

回答

1

,讓您的視圖中的屬性,並將其設置爲當前視圖控制器,當你創建:

viewcontroller.m:

myUIView = [[viewCreator alloc] init...]; 
myUIView.myViewController = self; 

view.h:

@property (weak) ViewController *myViewController;//weak or assign depending if you are using ARC or not, and ViewController should be the class of your view controller 

視圖.m:

@synthesize myViewController; 

然後,只需在問題中調用您在代碼中的方法即可。

你也應該看看如何使用代表,這是你應該使用代表的一個很好的例子。

+0

感謝Dan F,我認爲這將起作用。但是你是對的,我會仔細研究一下使用代表。 – 2012-07-19 17:30:13

+0

這裏的財產必須是'弱'。否則,您將創建一個保留循環並泄漏視圖和視圖控制器。 – 2012-07-19 19:06:04

+0

@RobNapier非常好的一點,只是強迫習慣打字就是這樣 – 2012-07-19 19:08:21

3

這是協議和授權的用途。想想如何UITableView處理這個問題。

@class MyView; 
@protocol MyViewDelegate 
- (void)myViewIsInABottle:(MyView *)view; 
@end 

@interface MyView : UIView 
@property (weak) id<MyViewDelegate> delegate; 
@end 

@implementation MyView 
-(void)isPressed{ 
    [self.delegate myViewIsInABottle:self]; 
} 
... 
@end 
+0

感謝羅布,是的,我會仔細看看這種方法。 (雖然真的不應該這麼難!) – 2012-07-19 17:31:06

+0

這種解耦是MVC的核心。如果你願意,你可以將一個視圖直接指向視圖控制器的@DanF註釋(儘管你需要使它變弱,不強),但是你會創建一個硬連接,使代碼難以重用。 – 2012-07-19 19:05:07

+1

更新:學習如何使用委託/協議,一直是一個真正的挑戰,有這麼幾個很好的,完整的例子。但是我發現了這個,這個幫助非常大:http://timneill.net/2010/11/modal-view-controller-example-part-2/ – 2012-07-20 14:13:18