我想要使用的方法都在AppDelegate中,但是我不太了解如何使用AppDelegate,我想到了两种可能的方法来实现这个目标,但我不知道它是否可行。
1.导入AppDelegate并覆盖我的VC中的方法 或者 2.在AppDelegate中创建我的VC的实例,并允许AppDelegate设置和检索我的UITextField的文本-(这是否违背MVC范式?)
感谢您的建议。
非常感谢您的时间。
@property (strong, nonatomic) NSString *textToBeSaved;
2) 在AppDelegate.m中,当您的应用程序启动和终止时,请读取并将textToBeSaved写入NSUserDefaults。在启动时:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.textToBeSaved = [defaults objectForKey:@"save_me"];
并且,在终止之前:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:self.textToBeSaved forKey:@"save_me"];
BOOL success = [defaults synchronize];
3) 在自然拥有UITextField的SomeViewController.m中,在viewWillAppear中:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
myTextField.text = appDelegate.textToBeSaved;
4) 当你设置textToBeSaved取决于你的用户界面时,但每当你知道文本已准备好(例如,在textFieldShouldReturn或shouldEndEditing中),你可以将字符串交给AppDelegate:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.textToBeSaved = myTextField.text;
-(void)record
{
// Read from UITextField, set UserDefaults and synchonize.
}
-(void)restore
{
// Read from UserDefaults, set UITextField.
}
以下是您在子类中可能执行的示例:
[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(restore)
name:UIApplicationDidFinishLaunchingNotification
object :nil];
别忘了将自己也从观察者中移除。如果你对 NSNotifications 不太熟悉,网上有很多教程可以参考。
在 App Delegate 中持有视图控制器链的引用是被允许的。苹果自己的示例和 iOS 应用程序模板经常将指向根视图控制器的指针放在 App Delegate 实例变量中。
如果视图控制器链没有被打破,一种可能的方法是让 App Delegate 向顶部或根视图控制器发送一个 "cleanUpNow" 消息,并让视图控制器将其传递下去,每个视图控制器根据需要进行清理,然后将该消息重新发送到链中更远的所有其他控制器以进行清理。
直接进入另一个视图控制器可能不如发送它一个清理自身的消息(写入 NSDefaults 等)。或者让它们所有人都向一个中央的 "清理" 控制器对象发送消息,该对象的目的是收集所有必要的状态并将其以一个连贯的块写出。
如果链断开了,另一个选项是让 App Delegate 发送一个通知,需要清理的任何控制器都可以注册处理程序来处理该 "清理" 通知。