1

我有一个由父类的实例创建的类实例。创建子类时,它会被赋予一个指向父类的指针,这样我就可以从子类在父类上启动一个实例方法(myMethod)。

我的父类是一个 UIViewController,称为myViewController。但是,XCode 给了我一个警告,说“UIViewController 可能无法响应 myMethod”。

导致错误的行(在子类中)如下所示:

[self.parent myMethod];

尽管这可以通过并且工作正常,但我想阻止警告消息。我可以做些什么来向 XCode 保证没有问题,并且“self.parent”(这是一个 UIViewController)响应“myMethod”吗?

4

2 回答 2

0

用正确的类声明指针,而不仅仅是 UIViewController。

为避免循环声明,请使用@class MyOwningViewController;. 例如,MyContainedViewController.h:

@class MyOwningViewController;
@interface MyContainedViewController {
    MyOwningViewController* owningViewController;
}
@property (weak, nonatomic) MyOwningViewController* owningViewController;
@end;

但是在 MyContainedViewController.m 中包含通常的 MyOwningViewController.h(除了可能在 MyOwningViewController.m 中包含 MyContainedViewController.h)。

MyOwningViewController.h:

#import "MyContainedViewConroller.h"  // Though you could use @class here as well
@interface MyOwningViewController {
    MyContainedViewController* containedViewController;  
}
@property (strong, nonatomic)  MyContainedViewController* containedViewController;
-(void) myMethod;
@end;

最后,在 MyContainedViewController.m 中:

#import "MyOwningViewController.h"

...

-(void) doSomething {
   [owningViewController myMethod];
}
于 2012-11-07T01:28:47.040 回答
0

你可以对它进行类型转换:

myViewController * p = (myViewController*)self.parent;
assert([p isKindOfClass:[myViewController class]]);
[p myMethod];

…虽然设计通常是一种气味。

于 2012-11-07T00:50:53.573 回答