1

我希望能够刷新另一个类的视图,但我尝试过的任何方法都不起作用。我的应用程序是一个设置了多个选项卡的选项卡式应用程序。我的 ViewController1 类中有一个名为 refresh 的方法,如下所示

-(void)TestMe{


     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"widgjson" ofType:@"json"];  
     NSData *myData = [NSData dataWithContentsOfFile:filePath];  

     NSString *responseString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     NSString *docDir = [paths objectAtIndex: 0];
     NSString *docFile = [docDir stringByAppendingPathComponent: @"json.txt"];
     [responseString writeToFile:docFile atomically:NO encoding:NSUTF8StringEncoding error:Nil];

     [self loadView];
     [self viewDidLoad];
}

这工作正常。当应用程序第一次加载时,它会加载一个不同的 json,然后当我单击此按钮时,它会加载一个新的 JSON,然后更新视图。这只是暂时测试刷新。但是,如果我尝试从另一个类或 AppDelegates ApplicationDidEnterForeground 方法调用此方法,则不会发生任何事情。我试着这样称呼它

 -(void)TestMe{


    ViewController1 *vc = [[ViewController1 alloc] init];


    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"widgjson" ofType:@"json"];  
    NSData *myData = [NSData dataWithContentsOfFile:filePath];  

    NSString *responseString = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex: 0];
    NSString *docFile = [docDir stringByAppendingPathComponent: @"json.txt"];
    [responseString writeToFile:docFile atomically:NO encoding:NSUTF8StringEncoding error:Nil];

    [vc loadView];
    [vc viewDidLoad];

}

那么为什么此方法不适用于任何其他类。我想要的只是能够从另一个类或应用程序加载时刷新视图,但似乎找不到任何有用的东西。

如果有人能指出我正确的方向,将不胜感激!

编辑:更新澄清

好吧,我暂时做的不喜欢的就是放这个

exit(0);

在 AppDelegates ApplicationDidEnterBackground 内部。这在一定程度上可行,但不是理想的解决方案。

我希望发生的是,当再次打开应用程序时,AppDelegate 会再次运行,从而设置选项卡。从服务器提取的 JSON 会影响选项卡的顺序,这就是为什么我需要 AppDelegates ApplicationDidFinishLaunching 方法重新加载自身的原因。

另外我想知道我可以从应用程序的另一个类中做到这一点。第一次加载我的应用程序时,它会询问用户的电话号码,该号码会发送到服务器,然后服务器会生成一个 PIN。完成后,我希望 AppDelegate 方法加载并开始设置选项卡和顺序等。

4

2 回答 2

3

为了防止您的应用程序在后台运行(以及在您退出和重新进入时强制重新加载),您可以在 info.plist中设置UIApplicationExitsOnSuspend密钥。YES

但是,这可能有点激烈。

您当前用于从应用程序委托刷新的代码是一个非启动代码,因为您正在创建视图控制器的一个新实例,而不是与屏幕上的一个实例对话。

出于这个原因,最好不要让您的应用程序委托人参与该过程。

相反,您的视图控制器可以将自己注册为UIApplicationDidBecomeActive通知的观察者,并对自己做任何需要的事情。您通常会在 viewDidLoad 上注册此通知,并在 viewDidUnload 上取消注册(因为根据定义,如果您已卸载视图,则无需在应用程序重新启动时刷新它!)。

您将按如下方式注册(在此处使用块,因为它们是未来):

声明一个 id 类型的 ivar 来保存观察者对象,我们becomeActiveObserver在这种情况下调用它。所以,无论你在哪里声明你的 ivars,添加id becomeActiveObserver. 然后,在 viewDidLoad 中:

becomeActiveObserver = [[NSNotificationCenter defaultCenter] 
addObserverForName:UIApplicationDidBecomeActive 
object:nil 
queue: nil 
usingBlock:^(NSNotification *note){ 
    //put your reloading code in here
    [self TestMe];
}];

并在 viewDidUnload 中像这样删除:

[[NSNotificationCenter defaultCenter] removeObserver:becomeActiveObserver;

您可以按照类似的模式从应用程序中的任何其他位置获取通知(您自己的或系统的)。这是一个比通过应用程序委托传递所有内容更好的设计,因为它涉及更松散的耦合。

于 2012-05-14T19:29:57.060 回答
2

我猜clickMe是一个按钮的动作。如果你想在启动时刷新视图控制器然后在视图控制器中添加一个类似于clickme的函数或刷新视图的任何函数并从applicationWillEnterForeground方法调用它,或者你可以试试这个: -

- (void)applicationWillEnterForeground:(UIApplication *)application 
{     
NSLog(@"app will enter foreground");     
[viewController clickMe:NULL]; 
} 

如果您的应用程序需要,您可以更改 appDelegate 的 applicationWillEnterForeground 方法中的文件。

于 2012-05-11T14:57:25.847 回答