我正在尝试做一些非常简单的事情:当应用程序从后台变为活动状态时更新我的(一个且唯一的)视图控制器上的一些标签(比如当前时间的简单性(即使在我的情况,我正在更新电话参数,如呼叫状态等,但这应该无关紧要))。
老实说,我确信一旦我调用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
}
答案 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
}