从UIView调用父方法



(这应该很简单。但它已经让我发疯好几个小时了。)我只是想从它的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中被#imported。)

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

这就是协议和委派的用途。想想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

在视图中创建一个属性,并在创建时将其设置为当前视图控制器:

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;

然后像在问题中的代码中一样调用该方法。

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

最新更新