0

私は非常に単純なことをしようとしています: バックグラウンドから来た後にアプリケーションがアクティブになったときに、(唯一の) ビューコントローラーでいくつかのラベルを更新します (簡単にするために現在の時刻で言います (私の場合は、通話状態などのテレフォニー パラメータを更新していますが、それは問題ではありません))。

正直なところ、 を呼び出すとviewDidLoad、このメソッドのコードが再び実行されるため、すべてのラベルが最新の状態になると確信していました。しかし、アプリを強制終了して再起動しない限り、それは起こりません。そのため、 の下のアプリ デリゲートで行ったことでapplicationDidBecomeActive、ビュー コントローラー メソッドを呼び出しました。

ViewController *vc = [[ViewController alloc] init];
[vc refreshCalls];

このコードは実行されますが、ラベルには何も起こりません。UIAlertViewこれを行うと、DOES には更新された情報があることも示されていますが、ラベルはありません。

どうすればこれを修正できますか? どんなアイデアでも大歓迎です。

これが私のアプリデリゲートapplicationDidBecomeActiveメソッドです:

- (void)applicationDidBecomeActive:(UIApplication *)application
{

ViewController *vc = [[ViewController alloc] init];
[vc refreshCalls];
}

そしてrefreshCallsView Controllerのメソッド:

 -(void) refreshCalls {

NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *currentTime = [dateFormatter stringFromDate:today];
NSLog(@"User's current time in their preference format:%@",currentTime);

  UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"TIME" message:currentTime delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil , nil];

 [alert1 show]; --> does show an update time        

myLabel.text = currentTime;
[self.view addSubview:myLabel]; --> nothing happens, stays the last time

 }
4

4 に答える 4

0

混乱を避けるために、以前の回答の結果として別の回答を作成することにしました。

基本的な考え方は、クラス内のサブスクライバーのリストを保持し、イベントが受信UIApplicationされたときに通知することです。UIApplicationDelegate方法は次のとおりです。

ステップ1

UIApplication派生クラス ヘッダーに、リストを管理するための静的メソッドの定義を追加します。

+ (void)addDelegate:(id <UIApplicationDelegate>)delegate;
+ (void)removeDelegate:(id <UIApplicationDelegate>)delegate;

UIApplicationDelegateそれは「自然な」解決策であるため、私は使用しています。ただし、独自のプロトコルを定義したり、UIApplicationDelegate.

ステップ2

アプリケーション クラスに実装を追加します。#import最初に、lastとの間のどこかにリストの定義を追加します@implementation

static NSMutableArray *_delegates;

内部@implementationに静的メソッド本体と初期化を追加します。

+ (void)initialize {
    _delegates = [[NSMutableArray alloc] init];
}

+ (void)addDelegate:(id <UIApplicationDelegate>)delegate {
    [_delegates addObject:delegate];
}

+ (void)removeDelegate:(id <UIApplicationDelegate>)delegate {
    [_delegates removeObject:delegate];
}

UIApplicationDelegateサブスクライバーに通知する必要があるメソッドごとに、次のサンプルのようなコードを追加します。

- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSEnumerator *enumerator = [_delegates objectEnumerator];
    id delegate;

    while (delegate = [enumerator nextObject]) {
        if ([delegate respondsToSelector:@selector(applicationDidBecomeActive:)]) {
            [delegate applicationDidBecomeActive:application];
        }
    }
}

ステップ 3

あなたのUIViewController(または他のクラス) に、サブスクライブ、サブスクライブ解除、および通知の処理を行うコードを追加します。UIApplicationクラスヘッダーをインポートすることを忘れないでください。

サブスクリプションは、init メソッド内で設定することも、内部で設定することもできUIViewControllerますviewDidLoad

[MyAppDelegate addDelegate:self]; // your class should implement UIApplicationDelegate

購読を解除することを忘れないでください。そうしないと、悪いことが起こる可能性があります! これを dealloc メソッドに追加するか、UIViewController内部viewDidUnloadで問題ありません。

[MyAppDelegate removeDelegate:self];

UIApplicationDelegate最後に、例について通知を受けるために必要なメソッドを追加します。

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // add your notification handling code here
}
于 2012-08-06T05:37:27.413 に答える
0

ViewControllerを使用するviewDidAppear:animated代わりに、 でラベルを更新できますapplicationDidBecomeActive。このようなもの:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self refreshCalls];
}
于 2012-08-05T00:07:59.273 に答える