(这应该很简单。但它已经让我发疯好几个小时了。)我只是想从它的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;
然后像在问题中的代码中一样调用该方法。
您还应该研究如何使用委托,这是您应该何时使用委托的一个完美示例。