1

我需要从应用程序的委托方法更改数据(标签)ApplicationDidEnterForeground而不分配新视图。该视图称为“提醒”,因此我将其导入到委托中,并且只有在分配它时才能访问其数据(提醒 *anything = [提醒分配...等),但因为我想更改当前加载的视图我需要直接访问已经加载的视图。

一旦我的应用程序进入前台,我将如何从委托更改主视图的标签?

obs:我知道我可以这样做,-(void)ViewDidLoad-(void)ViewWillAppear它不会解决我的问题,因为它不会更改标签,例如,如果用户通过通知框打开应用程序(手机锁定时滑动图标)。在这种情况下,如果应用程序在后台打开,则不会调用上述方法。

我不知道我是否清楚,希望我是。先感谢您。

4

3 回答 3

1

只需从您的 ApplicationDidEnterForeground: 方法发送通知并在要更新标签的那个类上接收它......就像这样..

//Your ApplicationDidEnterForeground:
[[NSNotificationCenter defaultCenter] postNotificationWithName:@"UpdateLabel" withObject:nill];

并在其中添加观察者 viewDidLoad: 您要更新标签的控制器

[[NSNotificationCenter defaultCenter] addObserver:self 
                                  selector:@selector(updateLabel:)
                                  name:@"UpdateLabel"
                                  object:nil];

在同一个班级中制作了您的方法...

- (void)updateLabel:(NSNotification *)notification{
    update label
}
于 2012-06-29T08:07:19.613 回答
1

如果您正在使用情节提要,您可以这样做以访问正在查看的当前视图

- (void)applicationDidEnterBackground:(UIApplication *)application
{ 
UINavigationController *a=_window.rootViewController;
Reminder *rem = a.topViewController;
rem.label.text=@"test";
}

如果不使用故事板

当我创建以后需要访问的视图时,我将它们定义为一个属性,就像这样

在 AppDelegate.h

//@interface SIMCAppDelegate : UIResponder <..........>
//{
//Some variables here
//}

//Properties here
@property (strong, nonatomic) Reminder *reminder;

//Some method declaration here
//eg: -(void) showSomething;

在 AppDelegate.m 上

//@implementation AppDelegate

@synthesize reminder;

所以当我分配/初始化这样的视图时

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//codes before here

self.reminder = [[Reminder alloc] init];
self.reminder.label.text = @"OLD LABEL";
//codes after here
}

分配其他方法后,我将能够再次访问它,像这样

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

self.reminder.label.text = @"NEW LABEL";
}
于 2012-06-29T08:27:27.623 回答
0

可能您可以尝试以下代码 -

NSMutableArray *activeControllerArray =  [self.navigationController.viewControllers mutableCopy];
for (int i = 0; i< [activeControllerArray count]; i++) {
    if ([[activeControllerArray objectAtIndex:i] isKindOfClass:[Reminder Class]) {
        Reminder *object = [activeControllerArray objectAtIndex:i];

        //Perform all the task here which you want.

        break; //Once found break the loop to do further processing.
    }
}
于 2012-06-29T08:04:12.567 回答