美文网首页
iOS 踩坑日记(一)

iOS 踩坑日记(一)

作者: 夜月饮酒 | 来源:发表于2018-06-05 15:07 被阅读0次

前言

在日常工作中,我常常遇到一些小坑和容易忘记的知识点,在此做一系列的记录,希望也能帮到你,不定期更新!

1. 多使用 CGRectGet 系列的函数

在使用 frame 对 UI 元素进行布局时,使用 CGRectGet 系列方法会使布局变得更加简单易懂,例如获取一个视图水平方向的中点:

CGFloat midX = CGRectGetMidX(testView.frame);

如果直接利用视图的几何属性计算的话,你得这样写:

CGFloat midX = testView.frame.origin.x + testView.frame.size.width / 2; 

虽然底层实现上并没有太大区别,但是使用 CGRectGet 系列函数会使代码更加简洁,而且在代码维护或审查时,开发人员看函数名就知道这个表达式的含义。

下面用一张图描述 CGRectGet 系列函数的意义:


CGRectGet释义图.jpeg
2. 考虑好在何处添加观察者

当你需要监听某条通知 (NSNotification) ,或者观察对象的某个属性 (KVO) 变化时,就需要考虑好是在 UIViewController 的 -viewDidLoad 方法还是在 -viewWillAppear 里面进行。

假设一个场景,某个页面底部有一个输入框,你需要根据键盘的出现和消失调整输入框的位置。

那么,当页面不在屏幕上时,输入框的位置已经无关紧要。也就是说,当页面出现时,添加对键盘出现通知的监听;页面消失时,移除监听。代码如下:

// 添加
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleKeyboardWillShow)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
}
// 移除
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

然而,在有些情况下,即使页面不在屏幕上显示,也仍需要处理某一些通知。例如,我需要在APP进入非活跃状态时,执行一些特定的操作,监听代码如下:

// 添加
- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleAppWillResignActive)
                                                 name:UIApplicationWillResignActiveNotification
                                               object:nil];
}
// 移除
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

因此,在使用 NSNotificationCenter 或 KVO 时,建议:

当页面不在屏幕上时

  • 仍需响应通知,那么就在 -viewDidLoad 中监听,在 -dealloc 中移除;
  • 不需要响应通知,那么就在 -viewWillAppear 中监听,在 -viewDidDisappear 中移除;

相关文章

  • iOS 踩坑日记(一)

    前言 在日常工作中,我常常遇到一些小坑和容易忘记的知识点,在此做一系列的记录,希望也能帮到你,不定期更新! 1. ...

  • iOS10的适配

    每次出了新系统,必然要踩很多坑,这次来踩一踩iOS10的坑吧。 一、证书问题 直接选择Automatically ...

  • Xcode10和iOS12踩坑

    Xcode10和iOS12踩坑

  • 开始学习一个新的领域--IOS逆向,记录其中遇到的一些五花八门的问题。 《IOS逆向踩坑日记》。 利己利人。 吱。

  • iOS 踩坑日记(二)

    3. 类别和扩展的区别 扩展不会像类别一样,有独立的实现文件(.m 文件),它的实现依赖于对应类 在类别中添加属性...

  • iOS项目中误删文件然后还原导致的问题

    本人初学的iOS,由于自己摸索,导出踩坑,特此随笔几下我踩过的坑,老鸟就不用点进来了。 一、加强对这个坑的认识,毕...

  • Cordova踩坑日记

    Cordova踩坑日记 1.配置环境 ​ 配置SDK踩了很多坑,其实只需要下载一个 android studi...

  • iOS13适配

    参考: iOS13 适配踩坑 - 持续更新 iOS 13 适配要点总结 iOS 13 适配要点总结 1、prese...

  • iOS踩坑

    1、文件找不到(移动项目文件info.plist)

  • # [iOS 预估值estimatedHeight实现head

    iOS 预估值estimatedHeight实现headerView和cell自适应高度布局机制踩坑

网友评论

      本文标题:iOS 踩坑日记(一)

      本文链接:https://www.haomeiwen.com/subject/abopsftx.html