0

ユーザーにログイン画面を表示できるように作成されたカスタムUISplitViewControllerがあります。このコントローラーには、ログアウト方法もあります。

ログアウトボタンは、MasterViewControllerのナビゲーションバーにあります。ユーザーがログアウトをクリックすると、UISplitViewControllerslogoutUserメソッドを呼び出そうとしています。最初に試しました:

[self.splitViewController logoutUser:self];

これにより、コンパイルしようとしたときにエラーが発生しました。

'UISplitViewController'の表示された@interfaceはセレクター'logoutUserを宣言しません:'次に、問題のある行をコメントアウトし、次のifを追加して、UISplitViewControllerがセレクターに実際に応答するかどうかを確認します。

if([self.splitViewController respondsToSelector:@selector(logoutUser:)]){
   // [self.splitViewController logoutUser:self];
    NSLog(@"Selector");
}else{
    NSLog(@"No Selector");
}

実行中のログにセレクターが表示されます。[self.splitViewController logoutUser:self]のコメントを外す同じエラーが発生します。

ビルドと再構築をクリーンアップしようとしましたが、それでもこのエラーが発生します。この問題をどのように解決しますか?

ありがとう、ブルース

4

3 に答える 3

1

self.splitViewControllerはベースsplitViewControllerのものであり、コンパイラはlogoutUserメソッドを見つけることができないようです。ただし、実行時にsplitViewControllerはメソッドに応答できます。splitViewControllerがカスタムであると言ったように、カスタムコントローラーにキャストしてみてください。

[(yourCustomViewController *)self.splitViewController logoutUser:self];

于 2012-04-11T15:49:24.357 に答える
1

メソッドが現在のスコープのどこかで宣言されている(つまり、インポートされたヘッダーのクラスで宣言されている)限り、Objective-Cの任意のオブジェクトに任意のメッセージを送信できます。

あなたが言及している2つの問題があるかもしれません:

  1. メソッドを含むヘッダーをインポートしませんでした。(宣言されているクラスは、現在呼び出しているクラスと同じである必要はありません。どこかで宣言されている必要があります。)この場合、メソッドが見つからないという警告が表示されます。 、およびメソッドがタイプを返すと想定しますid。これを修正するには、カスタムViewControllerのヘッダーをインポートします。

  2. self.splitViewControllerはタイプUISplitViewController *でありlogoutUser:、のメソッドではないため、そのメソッドに応答しないUISplitViewController可能性があるという警告(エラーではない)が表示される場合があります。UISplitViewController *は具象型であるため、これは静的型チェックの結果です。これはどちらかで修正できます

    1. Enriqueの回答が示唆しているように、そのメソッドをサポートするタイプにキャストします。また
    2. id静的な型チェックを行わないように型にキャストします。例:

    [(id)self.splitViewController logoutUser:self];

于 2012-05-04T20:10:45.010 に答える
-1

上でコメントしたように、私は答えを見つけました:

 [self.splitViewController performSelector:@selector(logoutUser:) withObject:self];
于 2012-04-20T16:43:49.023 に答える