1

ナビゲーション コントローラーのビューの 1 つに- (void) loadAlert、Web ページのコンテンツを取得して解析し、関連するコンテンツを .xml ファイルに配置するメソッドがありUITextViewます。メソッド呼び出しはviewDidAppear:、ビュー コントローラーのセクションにあります。ビューが最初にロードされたとき、およびナビゲートされたときにビューがまったく表示されたときに正常に機能します。

また、アプリがバックグラウンドから戻ったときに、このデータの読み込みが発生するようにします。多くの Stackoverflow の投稿やその他のソースが示しているように、メソッド呼び出しをapplicationDidBecomeActive:次のように配置しました。

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    MainViewController *mainView = [[mainViewController alloc] init];
    [mainView loadAlert];
}

ただし、アプリがバックグラウンドから戻ると、ビュー内では何も起こりません。UITextViewがクリアUIActivityIndicatorViewされ、コンテンツがインターネットから取得されている間に が回転し、新しいコンテンツが に読み込まれることを期待していUITextViewます。

メソッドが呼び出されていることはわかっていますが、ビュー内で何も起こっていません。このメソッドが呼び出されたときに、ビューがまだ読み込まれていないと感じています。アプリがバックグラウンドから戻ったときに、この特定のビューがナビゲーション コントローラーに表示されている現在のビューである場合、実際に UI を更新するように、メソッド呼び出しをどこに置くことができますか?

4

4 に答える 4

7

UIApplicationWillEnterForegroundNotificationまたはを使用できUIApplicationDidBecomeActiveNotificationます。アプリケーションのどこでもこれらの通知をリッスンするのは非常に効果的です。コントローラーをこれらの通知のいずれかに登録し、メソッドを使用して必要なものを表示するだけです。

     [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(showYourView)
                                                 name:UIApplicationWillEnterForegroundNotification object:nil];

-(void) showYouView(){
 // do your stuff
}

ノート

最善の方法は、UIApplicationWillEnterForegroundNotification を使用することです。これは、ユーザーがバックグラウンドからフォアグラウンドに移動したときにのみ実行されるためです。一方、UIApplicationDidBecomeActiveNotification は、アプリケーションがアクティブになるたびに実行されます。

于 2013-02-26T22:06:29.863 に答える
2

これを処理する適切な方法はMainViewControllerUIApplicationWillEnterForegroundNotification. 次に、通知を受信したら、loadAlertメソッドを呼び出します。

MainViewController.m で:

- (void)enterForeground {
    [self loadAlert];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
}

このために、アプリ デリゲートで何もする必要はありません。このように、MainViewController は、何がいつ起こるべきかを知る責任があります。

于 2013-02-26T22:18:09.553 に答える
2

mainViewControllerすでに存在する同じインスタンスを使用するのではなく、新しいインスタンスを作成しています。を実行しているときはいつでもmainViewController *mainView = [[mainViewController alloc] init];、それは新しいインスタンスです。ビューコントローラースタックにある同じインスタンスにアクセスして、その上でこのメソッドを呼び出す必要があります。

アプリがバックグラウンドから戻ったときに、この特定のビューがナビゲーション コントローラーに表示されている現在のビューである場合、実際に UI を更新するように、メソッド呼び出しをどこに置くことができますか?

UINavigationController が appdelegate にプロパティとして追加されていると仮定すると、以下のコードを使用してapplicationWillEnterForeground、topViewController で loadAlert を呼び出すことができます。

UIViewController *aViewController = self.navigationController.topViewController;
if ([aViewController isKindOfClass:[mainViewController class]]) {
    [(mainViewController *)aViewController loadAlert];
}

ちなみに、クラス名は大文字で始めてください。例:-通常は変数名を表すMainViewController代わりに使用する必要があります。mainViewController

アップデート:

UIApplicationWillEnterForegroundNotificationこのアプローチを使用している場合は、notificationMethodメソッドに上記のコードを追加して、それmainViewControllerが現在表示されているビュー コントローラーであることを確認する必要があります。そうしないと、予期しない動作が発生する可能性があります。

したがって、次のようなものが良いはずです。

- (void)notificationMethod {

   UIViewController *aViewController = self.navigationController.topViewController;
   if ([aViewController isKindOfClass:[mainViewController class]]) {
      [(mainViewController *)aViewController loadAlert];
   }
}
于 2013-02-26T22:05:56.307 に答える
0

私のプロジェクトでもまったく同じ必要があり、問題を処理するために notificationsCenter システムを経由する必要がありました。

まず、アプリケーションがフォアグラウンドに入ったときに通知を起動する必要があります。

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"app_entering_foreground" object:self];
}

次に、必要な場所でこの特定の通知を実際に聞く必要があります。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateUI) @"app_entering_foreground" object:nil];
于 2013-02-26T22:07:04.013 に答える