我正在为 iPad 开发 iOS 应用程序。我有一个 UIView 子类,我想从该子类调用 ViewController 的一个方法。我试图编写一个委托,但它不起作用。这是一个好的解决方案还是我必须以另一种方式做?
问问题
3766 次
2 回答
3
尝试块,这是示例:
我的视图.h
@interface MyView: UIView
...
@property (nonatomic, copy) void(^myEventCallBack)(id someData);
...
@end
MyView.m(如何调用块示例)
...
- (IBAction)buttonTapped:(UIButton *)sender {
if (self.myEventCallback) {
self.myEventCallback(self.someImportantData);
}
}
...
在你的 UIViewController 中:
self.myView = [[MyView alloc] initWithFrame:someFrame];
// THIS IS VERY IMPORTANT, USE __weak COPY OF YOUR UIViewController OBJECT (owner of object which contains block) INSIDE BLOCK TO PREVENT RETAIN CIRCLE, CAUSE BLOCK RETAINS ITS CONTENT
__weak MyViewController *self_ = self;
self.myView.myEventCallback = ^(id someData){
[self_ doSomeProcessingWithData:someData];
};
块也可以与返回值一起使用,示例:
@property (nonatomic, copy) BOOL(^shouldStartProcessing)(void);
self.myView.myEventCallback = ^BOOL{
return (self_.state == MyViewControllerStateReady);
};
于 2013-04-05T16:13:08.767 回答
1
一般来说,概念上“遥远的”对象之间的通信问题是一个棘手的问题,但它是 Cocoa 编程的核心。从一个实例到另一个实例的引用至关重要!我在这里讨论这个问题:
http://www.aeth.com/iOSBook/ch13.html#_instance_visibility
这是一种可能性。如果这个 UIView 实例在界面中,那么它要么nextResponder
是视图控制器,要么是作为视图控制器的父视图的子nextResponder
视图。此外,视图层次结构与响应者链平行。因此,只需沿着响应者链向上走,直到到达视图控制器。
UIResponder* r = someView; // the view instance, living in the interface
while (![r isKindOfClass:[UIViewController class]])
r = [r nextResponder];
现在r
是视图控制器。现在转换为您所知道的实际视图控制器的类,您将能够在其上调用方法:
MyViewController* vc = (MyViewController*)r;
这是我的书对响应者链的总结:
http://www.aeth.com/iOSBook/ch11.html#_the_responder_chain
然而,还有许多其他的可能性。正如有人已经建议的那样,您可以通过 NSNotification (shoutcasting) 建立通信线路;它很丑,但它确实有效,它的部分目的是为了覆盖这种棘手的情况。
于 2013-04-05T16:16:36.453 回答