Cocoa touch 在iOS4中使用快速应用程序切换重置应用程序设置的最佳方法

Cocoa touch 在iOS4中使用快速应用程序切换重置应用程序设置的最佳方法,cocoa-touch,ios4,settings,nsuserdefaults,Cocoa Touch,Ios4,Settings,Nsuserdefaults,我为我的应用程序制作了一个设置面板,上面有一个滑块,你可以将其设置为“下次启动时删除首选项”(在主iPhone设置应用程序中)。在我的应用程序的委托中,我这样做是为了让applicationWillEnterForeground检查设置开关是否在首选项中设置,并使用以下命令清除我的设置: [NSUserDefaults standardUserDefaults]setPersistentDomain:[NSDictionary dictionary]forName:[[NSBundle main

我为我的应用程序制作了一个设置面板,上面有一个滑块,你可以将其设置为“下次启动时删除首选项”(在主iPhone设置应用程序中)。在我的应用程序的委托中,我这样做是为了让applicationWillEnterForeground检查设置开关是否在首选项中设置,并使用以下命令清除我的设置:
[NSUserDefaults standardUserDefaults]setPersistentDomain:[NSDictionary dictionary]forName:[[NSBundle mainBundle]bundleIdentifier]]如有必要

我的问题是:如果由于iOS 4的快速应用程序切换(当我从设置应用程序返回时,视图仍在加载)而更改设置后,viewDidLoad和ViewDidDisplay在我的视图控制器中没有运行,我如何通知这些视图控制器设置已重置,以便它们可以重新加载所有数据?如果有一种方法可以从委托调用[MainViewController initData],但遗憾的是这无法实现。看起来,除非视图控制器中发生了操作,否则它无法知道是否已重置设置


任何帮助都将不胜感激。

通知通常是跨控制器等进行通信的最佳方式

首先,将初始化代码分离到视图控制器中的一个方法中,该方法由
viewdiload
/
viewwillbeen
调用。为了便于参考,我们将其命名为resetUser

[[NSNotificationCenter defaultCenter] postNotificationName:@"userRequestsReset" 
                                                    object:nil];
接下来,创建一个通知,当它看到已抛出此开关时,将从
应用程序willenterforeground
发出该通知。我们称之为userRequestsReset

[[NSNotificationCenter defaultCenter] postNotificationName:@"userRequestsReset" 
                                                    object:nil];
最后,在viewController中侦听userRequestsReset通知,并在收到通知时调用resetUser方法

在viewController的viewDidLoad中:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(resetNoticeReceived:)
                                             name:@"userRequestsReset"
                                           object:nil];
viewController中响应通知的方法:

- (void) resetNoticeReceived:(NSNotification *)notif {
    [self resetUser];
}
以及在viewDidUnload中将viewController作为观察者删除:

[[NSNotificationCenter defaultCenter] removeObserver:self];

通知通常是跨控制器等进行通信的最佳方式

首先,将初始化代码分离到视图控制器中的一个方法中,该方法由
viewdiload
/
viewwillbeen
调用。为了便于参考,我们将其命名为resetUser

[[NSNotificationCenter defaultCenter] postNotificationName:@"userRequestsReset" 
                                                    object:nil];
接下来,创建一个通知,当它看到已抛出此开关时,将从
应用程序willenterforeground
发出该通知。我们称之为userRequestsReset

[[NSNotificationCenter defaultCenter] postNotificationName:@"userRequestsReset" 
                                                    object:nil];
最后,在viewController中侦听userRequestsReset通知,并在收到通知时调用resetUser方法

在viewController的viewDidLoad中:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(resetNoticeReceived:)
                                             name:@"userRequestsReset"
                                           object:nil];
viewController中响应通知的方法:

- (void) resetNoticeReceived:(NSNotification *)notif {
    [self resetUser];
}
以及在viewDidUnload中将viewController作为观察者删除:

[[NSNotificationCenter defaultCenter] removeObserver:self];

非常感谢你的回复,马修。我会看看我现在是否能实现这一点,并让你知道(抱歉,如果我还是一个新手)。不用担心,它看起来很先进,但一旦你尝试一下,它就相当简单了。这非常有效!非常感谢!你的指示很清楚,也很容易遵守。起初我觉得NSNotificationCenter的想法有点让人望而生畏,但现在它看起来很简单。再次感谢!伟大的享受你新发现的力量!(注意:有可能会滥用通知,所以不要胡闹——如果有很多事情需要响应,你肯定会遇到麻烦。)非常感谢你的回复,Matthew。我会看看我现在是否能实现这一点,并让你知道(抱歉,如果我还是一个新手)。不用担心,它看起来很先进,但一旦你尝试一下,它就相当简单了。这非常有效!非常感谢!你的指示很清楚,也很容易遵守。起初我觉得NSNotificationCenter的想法有点让人望而生畏,但现在它看起来很简单。再次感谢!伟大的享受你新发现的力量!(注意:有可能滥用通知,所以不要胡闹——如果为了响应通知而发生了很多事情,你肯定会遇到麻烦。)