2

現在、5 つ以上のタブ バー項目を持つ UITabBarController を使用する iPhone アプリケーションを作成しています。したがって、「詳細」タブが自動的に生成されます (YouTube アプリケーションの場合と同様)。対応するビュー コントローラー クラスはUIMoreListControllerであることがわかりましたが、対応する .h ファイルがありません。したがって、私のコードは次のようになります。

@class UIMoreListController; // can't use #import since .h file is missing

@implementation SomeUINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated
{
     if ([viewController isKindOfClass:[UIMoreListController class]])
         ... // do something if "more" view is active

これは魅力のように機能します。ただし、コンパイラは私に与え続けます

警告: レシーバー 'UIMoreListController' はフォワード クラスであり、対応する @interface が存在しない可能性があります

この警告 (およびこの特定の警告のみ) を取り除くきちんとした方法はありますか? 繰り返しますが、使用できる .h ファイルがないため、#import を使用できません

4

5 に答える 5

10

クラスを確認するだけの場合はUIMoreListController、objc-api を使用してクラス変数にアクセスできます。

if ([viewController isKindOfClass:NSClassFromString(@"UIMoreListController")])

#importその後、または@class宣言は必要ありません。

于 2009-01-08T19:23:08.967 に答える
0

なぜこれをやろうとしているのですか?プライベート API は使用しないでください。このクラスが次の OS リリースでも存在するという保証はありません。存在すると仮定すると、その道はバグやクラッシュにつながります。

于 2009-01-10T12:48:57.757 に答える
0

標準の Cocoa Touch クラスを宣言または #import する必要はありません。UIMoreListController は、ドキュメントにリストされている場合、現時点で使用する必要があるパブリック クラスのようには見えません。リンク先のページは SDK ダンプです。App Store でアプリケーションをリリースする予定がある場合、その中のすべてが安全に使用できるわけではありません。

そうは言っても、それをタイプIDとして宣言し、必要に応じて、呼び出す必要がある UIMoreListController 固有のメソッドのいずれかで NSObject のカテゴリを宣言できます。

于 2009-01-08T16:45:52.577 に答える
0

タイプIDとして宣言し、必要に応じて、呼び出す必要があるUIMoreListController固有のメソッドのいずれかでNSObjectのカテゴリを宣言します。

これではうまくいきません。私が必要なのは

if ([viewController isKindOfClass:[UIMoreListController class]])

とにかく、App Store 経由で汚いハックをリリースすることについては正しいです。残念ながら、 Reference はこれらmoreNavigationControllerについてはやや秘密主義です。彼らは、それが単なる UINavigationController であると言っています (実際、そうです)。

おそらく、viewController が UIMoreListController であるかどうかを調べるには、別のアプローチを試す必要があります。何かのようなもの

if ([viewController isEqual:[navigationController topViewController]])

UIMoreListController は常に topViewController であるため、動作するはずです。(間違っているかもしれませんが、試してみます)

于 2009-01-08T18:50:10.313 に答える
0

moreNavigationControllerのデリゲートにいる限り、これでうまくいくはずです:

[viewController isEqual:[navigationController.viewControllers objectAtIndex:0]]

比較すると、topViewControllerあなたが望むものとは反対のものが得られます。を使用objectAtIndex:0すると、個人的な悪ふざけを避けることができます。

于 2010-02-03T17:13:57.317 に答える