2

コンパイラにこの特定の警告を無視させる方法はありますか?

これが私がすることです:

UIViewController *firstViewController = AppDelegate.instance.viewController;

//open the view of the clicked subItem
if ([firstViewController respondsToSelector:@selector(openView:inView:)]) {
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; //warning on this line
}

機能する1つの方法は、 (クラスの名前)に変更UIViewControllerすることです。ViewControllerしかし、この修正は今後うまくいかないので、この警告を無視する方法を探しています。

私は次のようなことをするので、将来はうまくいきません:

//.m

UIViewController *firstViewController;

//.h

if (someCondition) {
firstViewController = AppDelegate.instance.viewController;
}
else{
firstViewController = AppDelegate.instance.otherViewController;
}

if ([firstViewController respondsToSelector:@selector(openView:inView:)]) {
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; //warning on this line
}
4

3 に答える 3

3

必要に応じて、オブジェクトを正しい型にキャストする必要があります。必要に応じて、プロトコルに「キャスト」できることに注意してください。これにより、具象型を知らなくても、必要なメソッドが実装されていることを知ることができます。

コンパイラに文句を言わせたくない場合は、 を呼び出すことで可能performSelector:です。ただし、コンパイル時のチェックは行われません。

[object performSelector:@selector(doSomething)]; 

ディスカッションを参照してください: -performSelector: の使用 vs. メソッドの呼び出しのみ

セレクターにオブジェクトを 1 つだけ渡したい場合は、 variant を使用して可能performSelector:withObject:です。

複数のオブジェクトを渡したい場合は、iOS - How to implement a performSelector with multiple arguments and with afterDelay? で説明されているように、それらをコンテナー オブジェクトにラップする必要があります。.

于 2013-02-01T17:17:29.850 に答える
1

この場合、明示的な型変換 (キャスト) を発行するだけです。

UIViewController *firstViewController;
// ...

[(FirstViewController *)firstViewController openView:subItem.itemText.text inView:activeScreen];
于 2013-02-01T17:15:35.873 に答える
0

そのメソッドがコンパイラに認識されるように、必ず FirstViewController.h をインポートしてください。コードを少し調整します。

UIViewController *vc = AppDelegate.instance.viewController;

//open the view of the clicked subItem
if ([vc respondsToSelector:@selector(openView:inView:)]) {
    FirstViewController *firstViewController = (FirstViewController *) vc;
    [firstViewController openView:subItem.itemText.text inView:activeScreen];
}

これでうまくいくはずです。

于 2013-02-01T17:16:39.847 に答える