应用程序变为活动状态时更新uilabels

时间:2012-08-04 22:46:57

标签: iphone objective-c ios xcode uiviewcontroller

我正在尝试做一些非常简单的事情:当应用程序从后台变为活动状态时更新我的​​(一个且唯一的)视图控制器上的一些标签(比如当前时间的简单性(即使在我的情况,我正在更新电话参数,如呼叫状态等,但这应该无关紧要))。

老实说,我确信一旦我调用viewDidLoad,此方法中的代码就会再次运行,因此我的所有标签都是最新的。但这并没有发生,除非我杀了应用程序并重新启动它,所以我在applicationDidBecomeActive下的app委托中做了什么,我调用了我的视图控制器方法:

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

哪个执行此代码,但标签没有任何反应。在执行此操作时,我还会显示UIAlertView,其中包含更新的信息,但不会显示标签。

我该如何解决这个问题?任何想法将非常感激。

这是我的app delegate applicationDidBecomeActive方法:

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

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

视图控制器中的refreshCalls方法:

 -(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 个答案:

答案 0 :(得分:4)

首先,你不应该致电ViewDidLoad。它会被调用,就像applicationDidBecomeActive一样。

现在,回答:

正在发生的事情是,您在新的refreshCalls上调用了ViewController方法,而不是现有的方法,您可能在应用代理中的某处创建了该方法。首次创建ViewController时,您可能会将其视图添加到UIWindow

然后,当您在ViewController中创建新的applicationDidBecomeActive并在其上调用refreshCalls时,它会像应该的那样更新,但其视图不会显示在屏幕上,因为您没有将其添加到UIWindow

尝试找到appDelegate您首先创建ViewController的位置并将其分配给某个媒体资源。然后,不要在ViewController中创建新的applicationDidBecomeActive,而是获取现有的refreshCalls并在其上调用{{1}}方法。

答案 1 :(得分:0)

我认为如果您的视图中已有myLabel,则可能不应添加另一个。也许您可以尝试使用@property self.myLabel,只需在每次要更新文本时调用self.myLabel.text = currentTime;。 (再次没有addSubview或东西..)

答案 2 :(得分:0)

您可以在ViewController的{​​{1}}更新标签,而不是使用viewDidAppear:animated。像这样:

applicationDidBecomeActive

答案 3 :(得分:0)

为了避免混淆,我决定根据我之前的答案创建另一个答案。

基本思路是在UIApplication课程中保留订阅者列表,并在收到UIApplicationDelegate个事件时通知他们。这是怎么做的。

第1步

UIApplication派生类头中添加静态方法的定义以管理列表:

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

我正在使用UIApplicationDelegate,因为它是一种“自然”的解决方案。但是,您可以定义自己的协议或扩展UIApplicationDelegate

第2步

在您的应用程序类中添加实现。首先在最后#import@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方法,以获得有关ex:

的通知
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // add your notification handling code here
}