美文网首页
17.3.24备忘录

17.3.24备忘录

作者: cdd48b9d36e0 | 来源:发表于2017-03-24 16:49 被阅读9次

    1、为什么通知必须在dealloc里移除(02-UITableview(4))

    一个addServer会在通知中心里产生一个指针指向该通知的观察者,如果dealloc的时候不移除,那么只要通知被再次触发通知中心就会根据这个指针也就是地址去给这个观察者发送消息,这其实就是操作野指针了

    2、setValuesForKeysWithDictionary的实现原理(03-UI进阶(1))

    1. 遍历所有的key得到key的值name
    2. 去模型查找有没有setName:方法,有的话直接赋值 setName:name
    3. 假如没有该set方法,就去模型中查找有没有_name属性,有的话_name = name
    4. 假如没有_name,就去模型中查找有没有name属性
    5. 假如还是没有,就会报错

    第二步setName:这里只要求名字一样,后面的参数类型是可以替换的(0609-UIPickerView键盘处理)

    3、一个IOS程序启动步骤(03-UI进阶(2))

    • 第一步加载main.m文件
    • 创建UIApplication
    • 创建UIApplicationDelegate,并且成为UIApplication代理
    • 开启主运行循环,保持程序一直在运行
    • 加载info.plist,判断有没有指定main.stroyboard,指定了就加载(这里判断的方法就是看General→DeploymentInfo→MainInterface有没有指定)
    • 第二步加载main.stroyboard(如果有的话),如果没有就用代码实现
    • 创建窗口
    • 加载main.storyboard,并且加载main.storyboard指定的控制器
    • 把新创建的控制器作为窗口的根控制器,让窗口显示出来

    4、事件的传递(03-UI进阶(5))

    点击一个控件让他响应指定的操作,这个事件会经历产生、传递、响应三个过程:

    • 事件的产生
      发生触摸事件后,UIApplication会把该事件加入到事件队列中,然后取出事件队列最前面的事件,交给主窗口(KeyWindow),去找到最合适的View响应事件

    • 事件的传递(核心)
      首先要明确一点:事件的传递是从父控件到子控件的。
      其次,这个过程只做了一件事:怎么找到最合适的那个View响应事件。🍎已经提供了一个专门来做这件事的Api:

     - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        // 调用系统的做法去寻找最合适的view,返回最合适的view
        return [super hitTest:point withEvent:event];
    }
    

    实际项目中,需求通常是要点击一个控件让另外一个控件响应,这时候就需要重写hitTest方法。重写分为三步,第一步是判断自己能不能响应事件,包括打开用户交互、hidden、alpha三个方面;第二步是触摸点在不在自己身上;第三部是倒序遍历子控件,重复前两步,直到找到最合适的View,这是一个递归的过程。

     - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
    //    NSLog(@"%@--hitTest",[self class]);
    //    return [super hitTest:point withEvent:event];
        
        NSLog(@"%@--%@",[self class],NSStringFromCGPoint(point));
        // 1.判断当前控件能否接收事件
        if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
        
        // 2. 判断点在不在当前控件
        if ([self pointInside:point withEvent:event] == NO) return nil;
        
        // 3.从后往前遍历自己的子控件
        NSInteger count = self.subviews.count;
        
        for (NSInteger i = count - 1; i >= 0; i--) {
            UIView *childView = self.subviews[i];
            
            // 把当前控件上的坐标系转换成子控件上的坐标系
         CGPoint childP = [self convertPoint:point toView:childView];
            
           UIView *fitView = [childView hitTest:childP withEvent:event];
            if (fitView) { // 寻找到最合适的view
                return fitView;
            }  
        }
        // 循环结束,表示没有比自己更合适的view
        return self;
    }
    
    • 事件的响应
      响应与传递相反,在找到最合适的View后,从这个View开始沿着响应者链条往上传递事件做出响应。
    • 一个事件允许有多个响应者
    • 当前响应者为控制器的View时,他的上一级响应者就是控制器本身,否则就是父控件
    • 一个控件的响应方法(也就是touch方法)默认是什么都不做只是把事件抛给上一级响应者。所以重写了touch方法后,要想继续抛事件的话必须调用super touch方法,否则事件就到此停下不会继续往上响应了

    5、环信(16-环信(总结))

    登录注册模块要注意的:自动登录、自动联网、自动连服务器
    好友管理模块:获取、添加、删除好友(包括数据库结构,第一次登录或者改变好友后从服务器拉取好友保存到数据库,以后每次都是从本地数据库拉取好友列表)

    相关文章

      网友评论

          本文标题:17.3.24备忘录

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