`

在ViewController中使用自定义Notification处理applicationWillTerminate

 
阅读更多

Scenario:
    希望在app退出时保存当前View中的UITextView的值,以便在app重新打开时显示用户退出前编辑的内容。 在AppDelegate的applicationWillTerminate中已经包含了保存NSUserDefaults的代码,仅需View在app退出时将UITextView的值保存在NSUserDefaults中。
    首先考虑的是在ViewController中通过接收处理系统的UIApplicationWillTerminateNotification来保存。于是有

- (void)saveCurrentValue {
    // saving here
}

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentValue) name:UIApplicationWillTerminateNotification object:nil];
}
 

 

 

    但实际测试中发现并没能保存UITextView的内容,通过NSLog调试才发现,原来在退出时,系统先执行了AppDelegate中的applicationWillTerminate,然后才执行ViewController中的saveCurrentValue代码,所以无法保存内容。

解决方法:

    在AppDelegate的applicationWillTerminate中发送自定义的Notification,ViewController中通过接收该自定义Notification处理保存内容的操作,这样就可以保证在AppDelegate的保存 NSUserDefaults操作前先将内容保存。

#define kMyNotificationTerminate            @"MyNotificationTerminate"
 
//SampleAppDelegate.m
- (void)applicationWillTerminate:(UIApplication *)application {
    // post willterminate notification to allow views to save current status
    [[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationTerminate 
                                                        object:nil];
    
    // Save changes.
}
 
//MySampleViewController.m
(void)saveCurrentValue {
    // saving value here
}

- (void)viewDidLoad {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentValue) name:kMyNotificationTerminate object:nil];

}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kMyNotificationTerminate object:[UIApplication sharedApplication]];
    
    [super dealloc];
}
 

 

 

 

分享到:
评论

相关推荐

    自定义presentViewController的转场动画(Swift)

    本篇文章将深入探讨如何在Swift中自定义`presentViewController`的转场动画,帮助开发者创建出独特且吸引人的界面过渡效果。 首先,我们需要了解`UIViewControllerTransitioningDelegate`协议。这个协议提供了...

    使用Delegate在两个ViewController间传值

    在不同视图控制器(ViewController)之间传递数据,我们可以采用多种方法,其中一种常见且灵活的方式就是使用委托(Delegate)协议。本篇将详细介绍如何在两个ViewController之间利用委托协议进行值传递,以及它与...

    swift中UITableView自定义cell添加与删除及表的刷新wift中UITableView自定义cell添加与删除及表的刷新

    以上就是在Swift中自定义UITableView的Cell,以及处理数据的添加、删除和刷新的基本操作。这只是一个基础的指南,实际项目中可能需要考虑更多细节,如动画效果、异步数据加载、错误处理等。通过不断地实践和学习,你...

    ViewController的使用方法

    以上就是ViewController,尤其是UITabBarController、UINavigationController和UIViewController在iOS应用开发中的使用方法。掌握这些知识点对于初学者来说非常重要,可以帮助构建出结构清晰、易于管理的应用程序...

    ios7自定义viewcontroller切换效果

    标题“ios7自定义viewcontroller切换效果”和描述“ios7 viewcontroller 自定义切换效果,项目简单,demon清晰”指的是如何在iOS 7环境中,自定义UIViewController之间的过渡动画,以提供更加个性化和流畅的用户界面...

    ios实现viewcontroller切换传值的三种方法

    // 在prepare(for:sender:)方法中使用自定义初始化 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let destinationViewController = segue.destination as? ReceiverViewController { ...

    两个viewcontroller的界面切换

    "两个viewcontroller的界面切换"这一主题涉及到如何在iPhone应用程序中平滑地从一个ViewController过渡到另一个,同时实现动画效果,以提供良好的用户体验。在这个过程中,我们可以使用多种方法来实现这种切换,包括...

    IOS 自定义导航栏 和表格 学习笔记

    在iOS开发中,自定义导航栏(Navigation Bar)和表格(TableView)是两个非常重要的组件,它们...在阅读博客和分析代码的过程中,你将对iOS中的自定义导航栏和表格使用有更深的理解,也能更好地应对实际开发中的需求。

    导航控制器presentViewController

    在导航控制器中使用`presentViewController`时,通常是为了展示非线性或者临时性的内容,例如设置界面、登录页面或者模态对话框。由于导航控制器本身已经有一个堆栈管理的视图控制器序列,`presentViewController`并...

    半透明ViewController

    在iOS开发中,半透明...通过遵循`UIStoryboardDelegate`协议,可以在特定的生命周期方法中进行自定义操作,比如在ViewController加载时调整其透明度和模糊效果。不过,具体实现需要查看实际的代码内容才能详细解析。

    Swift实现简单自定义TableViewCell

    在iOS应用开发中,`UITableView` 是一个非常重要的组件,用于展示列表数据。...通过学习和实践这些步骤,你将能够熟练地在Swift中创建和使用自定义的`UITableViewCell`,提升你的iOS应用的用户界面和交互体验。

    iOS之presentViewController模态全屏适配解决方案.docx

    原理是,在运行时检查方法,然后做IMP交互,让方法重载,执行自定义代码。代码如下: ```objective-c #import NS_ASSUME_NONNULL_BEGIN @interface UIViewController (ITModal) @end NS_ASSUME_NONNULL_END #...

    swift-实现类似于Facebook的滑动和滚动拉消失的Viewcontroller

    在iOS应用开发中,创建一个类似Facebook的用户体验是常见的需求,其中包括Viewcontroller的滑动和滚动拉消失效果。这种效果允许用户通过向上滑动或滚动来渐隐当前ViewController,通常是展示详细信息或对话框时,...

    iOSm界面跳转和参数传递之presentViewController与dismissViewControllerAnimated

    7. **使用Notification Center**:发布和订阅通知是另一种传递数据的方式,特别是在多个对象间通信时。 总之,`presentViewController`和`dismissViewControllerAnimated`是iOS开发者在实现界面跳转时常用的方法。...

    swift自定义tabbar

    5. **集成到项目**:在需要使用自定义TabBar的ViewController中,将`tabBar`属性设置为`CustomTabBar`的实例,并确保正确设置了对应的ViewControllers和`tabBarItem`s。 在实现过程中,我们还需要考虑以下几点: -...

    IOS实现在两个ViewController间传值(一)

    在iOS中,有多种方法可以实现在ViewController之间传递数据,包括属性赋值、代理设计模式、通知中心、块(Block)以及使用Storyboard中的segue。这里我们将重点讨论前两种方法:属性赋值和代理设计模式。 **属性...

    presentViewController:如何不覆盖原先的viewController界面

    在iOS应用开发中,`presentViewController:animated:completion:` 是一个常用的方法,用于将一个新的视图控制器(UIViewController)呈现到当前的视图控制器之上。然而,通常情况下,这个方法会完全遮挡掉原先的视图...

    IOS强制子VIEWCONTROLLER为横屏

    3. **在父ViewController中present横屏ViewController**:当需要显示横屏ViewController时,使用`presentViewController:animated:completion:`方法。注意,如果你的父ViewController是希望保持竖屏的,确保它支持竖...

    ios-Swift-自定义tabBar.zip

    在本项目"ios-Swift-自定义tabBar.zip"中,重点是讲解如何使用Swift来实现一个自定义的TabBar,这在很多应用程序中都是非常常见的需求。TabBar作为iOS界面设计中的一个重要组成部分,它允许用户在不同的视图之间进行...

    自定义CustomCell

    在`cellForRowAt`中,使用`dequeueReusableCell(withIdentifier:for:)`方法获取自定义`Cell`实例,然后配置每个UI元素: ```swift func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -...

Global site tag (gtag.js) - Google Analytics