从UIView调用父方法

时间:2012-07-19 17:09:20

标签: iphone ios xcode ios5

(这应该很简单。但是它让我疯了好几个小时。) 我只是试图从它的UIView中调用一个ViewController方法。

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.
}

(ViewController头文件在UIView中被#import编辑。)

非常感谢一些帮助。当然这应该很简单!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

view.m:

@synthesize myViewController;

然后只需调用方法,就像问题中的代码一样。

您还应该研究如何使用委托,这是您应该何时使用委托的完美示例。