0

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

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

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

哪个确实执行此代码,但标签没有任何反应。这样做时,我还显示了一个UIAlertView确实有更新的信息,但没有标签。

我怎样才能解决这个问题?任何想法将不胜感激。

这是我的应用程序委托 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

4 回答 4

4

首先,您不应该调用ViewDidLoad. 它会为您调用,就像applicationDidBecomeActive.

现在,回答:

refreshCalls正在发生的事情是您在新的而不是现有的方法上调用您的方法ViewController,您可能在应用程序委托的某处创建了该方法。当你第一次创建你的ViewController时,你可能将它的视图添加到UIWindow.

然后,当您创建一个新ViewController的 inapplicationDidBecomeActive并调用refreshCalls它时,它会按原样更新,但它的视图不会显示在屏幕上,因为您没有将它添加到UIWindow.

尝试在appDelegate您的第一次创建您的位置ViewController并将其分配给属性。然后,不要创建新ViewController的 in ,而是applicationDidBecomeActive获取现有的 in 并在其上调用您的refreshCalls方法。

于 2012-08-04T23:12:39.777 回答
0

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

于 2012-08-04T22:51:33.397 回答
0

您可以更新您的标签,ViewControllerviewDidAppear:animated不是使用applicationDidBecomeActive. 像这样的东西:

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

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

基本思想是在您的班级中保留订阅者列表,并在收到事件UIApplication时通知他们。UIApplicationDelegate这是如何做到的。

第1步

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

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

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

第2步

在您的应用程序类中添加实现。首先在 last#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 方法或 for UIViewControllerinsideviewDidUnload中添加它就可以了。

[MyAppDelegate removeDelegate:self];

最后添加UIApplicationDelegate您需要获得有关 ex 通知的方法:

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