1

我正在为 iPad 开发 iOS 应用程序。我有一个 UIView 子类,我想从该子类调用 ViewController 的一个方法。我试图编写一个委托,但它不起作用。这是一个好的解决方案还是我必须以另一种方式做?

4

2 回答 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 回答