1

親クラスのインスタンスによって作成されたクラスインスタンスがあります。子クラスが作成されると、親クラスへのポインターが与えられるため、子クラスから親クラスでインスタンスメソッド(myMethod)を起動できます。

私の親クラスはmyViewControllerと呼ばれるUIViewControllerです。ただし、XCodeは、「UIViewControllerがmyMethodに応答しない可能性がある」という警告を表示します。

エラーの原因となる(子クラスの)行は次のようになります。

[self.parent myMethod];

これは順調に進んで正常に機能しますが、警告メッセージを防ぎたいと思います。XCodeに問題がなく、「self.parent」(UIViewController)「myMethod」に応答することを保証するためにできることはありますか?

4

2 に答える 2

0

あなたはそれを型キャストすることができます:

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

…デザインはしばしば匂いですが。

于 2012-11-07T00:50:53.573 に答える
0

UIViewControllerだけでなく、適切なクラスでポインタを宣言します。

循環宣言を回避するには、を使用します@class MyOwningViewController;。例:MyContainedViewController.h:

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

ただし、通常のMyOwningViewController.hをMyContainedViewController.mに含めます(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 に答える