0

私はUIViewをスライドさせるための汎用コントローラーを開発し、UIViewController(および明らかにサブクラス)を管理し、UIViewControllerのサブクラスがこのメソッドに応答する場合にのみ特定のメソッド(フリーズ)を呼び出す必要があります。

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [ ((id) _rootViewController) freeze];
}

_rootViewControllerのクラスはわかりませんが、UIViewControllerのサブクラスであることはわかっています。このため、_rootViewControllerをIDにキャストしようとしましたが、コンパイルできません。

環境:XCode 4.5.1、iOs 4.3+、ARC

エラー:「セレクター「フリーズ」のインスタンスメソッドがわからない」

注:開発者に_rootViewControllerに特定のUIViewControllerサブクラスを使用するように強制することはできません。

4

2 に答える 2

2

「ジェネリック」タイプがセレクターに応答するかどうかを確認した後、単純な0-1パラメーターメソッドの場合はperformSelector:/を使用して呼び出し、それ以外の場合は。を使用します。引数がないので、単に使用します。performSelector:withObject:NSInvocationfreezeperformSelector:

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [_rootViewController performSelector:@selector(freeze)];
}
于 2012-11-14T17:58:17.440 に答える
1

これはエラーではなく警告のようです。コードをコンパイルして、この診断メッセージを無視できるはずです。ただし、それを完全に取り除きたい場合は、プロトコルを宣言し、次のようにキャストを行うことができます。

@protocol MyProtocol <NSObject>

- (void)freeze;

@end

[(id <MyProtocol>)_rootViewController freeze];
于 2012-11-14T17:36:20.690 に答える