我一直在努力让这段代码工作,但我不知道我做错了什么。每次应用程序从睡眠状态唤醒,或者用户关闭应用程序并再次打开它(不关闭应用程序从多任务处理),我想要更改标签值。 在我的applicationDidBecomeActive中,我正在运行一个计数器,我希望在当时打开的任何viewcontroller上显示该计数器。
代码:
- (void)applicationDidBecomeActive:(UIApplication *)application {
counter = counter + 1;
W1G1 *view1 = [[[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil] retain];
[view1 setlabel];
}
在我的viewcontroller W1G1中,我有以下代码: 代码:
- (void) setlabel {
NSString *string = [NSString stringWithFormat:@"%d", counter];
vocabword.text = string;
}
我已经在我的appdelegate中导入了W1G1,但代码没有运行:(请帮忙!
由于
答案 0 :(得分:3)
在AppDelegate.m文件中,您有
- (void)applicationDidBecomeActive:(UIApplication *)application {
counter = counter + 1;
W1G1 *view1 = [[[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil] retain];
[view1 setlabel];
}
递增的变量counter
仅限于AppDelegate
。换句话说,您的视图控制器不知道它已经增加。
我建议您使用NSUserDefaults
存储counter
的值,以便您可以轻松地在这些视图控制器之间传递它。或者,或者您可以允许输入方法setLabel
,例如
- (void) setlabel:(int)counter {
NSString *string = [NSString stringWithFormat:@"%d", counter];
vocabword.text = string;
}
然后在AppDelegate中你想做的事:
- (void)applicationDidBecomeActive:(UIApplication *)application {
counter = counter + 1;
W1G1 *view1 = [[[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil] retain];
[view1 setlabel:counter]; // <-- now you're using counter
[self.window addSubview:view1];
}
答案 1 :(得分:2)
1)当你说'代码没有运行'时你的意思是?也就是说,如果你把NSLogs放在applicationDidBecomeActive中:并且在setLabel中它是否显示代码是否运行?
2)我怀疑代码正在运行。但是你的代码不会“显示那个时刻控制器打开的计数器”。您的代码会创建一个新视图(view1),但不会显示该视图。它不会作为子视图添加到任何内容中。你的代码也会泄露。您创建了一个W1G1对象,但它永远不会被释放,您将丢弃任何对它的引用。
要实现您的目标,您可以在应用程序窗口中添加子视图。根据您的应用程序委托的设置方式,以下内容应该可以解决问题:
counter++;
W1G1 *viewController1 = [[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil];
[viewController1 setlabel: counter];
[[self window] addSubview: [viewController1 view]]
// you'll want to save a reference to the viewController somehow so you can release it at a later date
然后在W1G1
- (void) setlabel: (int) counter;
{
NSString *string = [NSString stringWithFormat:@"%d", counter];
vocabword.text = string;
}
当然,还有很多其他方法可以解决这个问题。你需要一些策略来删除你在某个阶段添加的W1G1视图,否则你只会添加越来越多的视图。
更新:您(在评论中)询问如何在应用程序的整个生命周期内跟踪您的viewController ...一种方法是在appDelegate中跟踪它。在标题中有类似的内容:
@class W1G1;
@interface MyAppDelegate : : NSObject <UIApplicationDelegate>
{
// other decelerations
int counter;
W1G1 * _myW1G1
}
@property (nonatomic, retain) W1G1* theW1G1
在.m文件中包含
@synthesize theW1G1 = _myW1G1;
可能在应用程序中:didFinishLaunchingWithOptions:创建viewController,设置属性以引用它,并将其视图添加到视图层次结构中。
W1G1* theViewController = [[W1G! alloc] initWithNibName: @"W1G1" bundle: nil];
[[self window] addSubview: [theViewController view]];
[self setTheW1G1: theViewController];
[theViewController release];
然后,当您想要使用app delegate再次访问viewController时,请使用[self theW1G1],例如
[[self W1G1] setlabel: counter];