4

これは私が抱えている非常に興味深い問題です。私のアプリにはpresentViewController:animated:completion:、およびに問題がありdismissViewControllerAnimated:completion:ました。何が起こったのかというと、presentViewController が呼び出され、サーバー情報に基づいて、View Controller が破棄される可能性があります。「完全に表示される前に閉じることはできません」というエラーが表示されます (アニメーションは YES に設定されています)。

現在を処理するためのキューを実装し、呼び出しを却下しました。これは完璧に機能し、このソリューションに本当に満足しています。次に、別の問題に気付きました。誤って Apple のメソッドを直接呼び出したらどうなるでしょうか (私には、キューイングを処理する というメソッドがありmyPresentViewController:animated:completion:ますmyDismissViewControllerAnimated:completion:)。

Apple のメソッドを直接呼び出した場合に警告メソッドを設定する方法はありますか? カテゴリを作成してみました (拡張機能も試しました)、Apple の現在のメソッドと破棄するメソッドを定義し、非推奨のメッセージをそれらに追加しました。これらの方法はどちらも機能しませんでした。私はメソッドを入れ替えることを考えましたが、それは機能しません。なぜなら、入れ替えられたメソッドがそれをキューに追加した場合、アップルの実装を呼び出すタイミングをどのように知るのでしょうか? Apple のメソッドを呼び出す必要がある 1 つの場所に警告が表示されることはわかっていますが、#pragma を使用して、必要な 2 行の警告を抑制することができます。

4

1 に答える 1

3

を拡張するView Controller基本クラスを作成しますUIViewController。次に、すべてのビュー コントローラーがこの基本クラスを拡張していることを確認します。必要に応じて同じことを行いUITableViewControllerます。

これらの基本クラスでは、2 つのメソッドを実装し、非推奨フラグを .h ファイルのメソッド宣言に追加できます。

TGViewController.h

@interface TGViewController : UIViewConrtoller

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_DEPRECATED_IOS(5_0, 6_0);
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_DEPRECATED_IOS(5_0, 6_0);

@end

TGViewController.m

@implementation TGViewController

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion {
    [super presentViewController:viewControllerToPresent animated:flag completion:completion];
}

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion {
    [super dismissControllerAnimated:flag completion:completion];
}

@end

プラグマは必要ありません。

これらの基本クラスを使用して、必要なその他のアプリ レベルの機能を追加することもできます。

于 2014-05-13T16:25:04.683 に答える