你的位置:首页 > 操作系统

[操作系统]iOS UI基础03


  • plist文件
    • root: 代表着存储的是什么类型的数据
       如果root是array, 那么将来从文件中读取进来的就是数组 plist中的每一个item就代表着数组中的一个元素 item对应的类型, 就代表数组中每一个元素的类型
    • 自定义的plist文件的名称不能包含info这个单词,因为系统配置是info.plist
    • 获取plist文件路径
      • NSString *path = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil];
  • 字典转模型

    • 原因:

      • 在开发中一般不会直接从字典中获取数据

        • 1.字典的key是一个字符串, 写错不会报错
        • 2.英语不好, 单词记不住
        • 3.由于key是一个字符串, 所以在编码的时候没有提示
      • 为了解决这个问题, 我们可以使用对象来保存数据,对象的作用就是用于存储数据, 那么我称这个对象为模型

      • 规律: 在开发中但凡看到字典, 一般情况下都会创建一个与之对应的模型来保存字典中的数据
      • 字典数组中还有字典数组 不能使用kvc进行字典转换模型
      • 一般步骤:
        • 1.获取plist文件的绝对路径
        • 2.根据路径加载plist文件
        • 3.将数组中所有的字典转换为模型
  • 自定义VIEW

    • 自定义View的步骤:
      • 1.重写初始化方法 (在里面进行一次性的初始化) xib :awakeFromNib 纯代码:initWithFrame
      • 2.重写layoutSubviews, 在里面布局子控件
      • 3.接收外界传入的数据, 重写set方法
    • 注意:
      • 如果自定义一个View, 不建议在init方法中设置子控件的位置 因为如果子控件的位置需要根据父控件的frame来计算, 在init方法中拿不到父控件的frame
    • 注意:
      • 一般情况下自定义一个控件会重写控件的initWithFrame方法, 因为用户可能通过init方法创建也可能通过initWithFrame方法创建, 为了保证无论用户通过哪一个方法创建都能添加子控件, 所以重写initWithFrame,init方法内部会调用initWithFrame
    • 注意:
      • 如果在类方法中创建对象, 建议使用self, 不要使用类名 如果直接使用类名,在有子类的时候由于父类已经写死了,所以就不能通过该方法创建子类对象
    • layoutSubviews
      • 专门用于布局子控件的位置
      • 重写layoutSubviews方法, 一定要调用[super layoutSubviews]方法 如果不调用, 会出现一些奇葩的错误
    • 重写模型set
      • 设置子控件的数据
  • 使用week保存控件的原因:

    • 只要将一个对象添加到父控件中, 那么父控件中的subViews数组就会强引用这这个控件
  • xib
    • Xib和Storyboard一样都是用来描述界面的
    • Xib是Storyboard的前身
    • Xib是用于描述一个简单的界面或者一个局部的界面
    • Storyboard是用于描述整体
    • 拿到Xib方法
    • NibName: 需要加载的xib名称 bundle: 从哪个包中查找
    • - 1.UINib *nib = [UINib nibWithNibName:@"ShopView" bundle:[NSBundle mainBundle]];- 创建xib中描述的所有界面  NSArray *res = [nib instantiateWithOwner:nil options:nil];  [self.shopsView addSubview:res.firstObject]; 2.NSArray *res = [[NSBundle mainBundle] loadNibNamed:@"ShopView" owner:nil options:nil];  [self.shopsView addSubview:res.firstObject];
    • xib加载原理:
      • 1.根据custom class创建对象 JXShopView *shopView = [JXShopView alloc] init];
      • 2.根据xib中的设置, 设置控件的相关属性 shopView.backgroundColor = [UIColor redColor]; shopView.frame = CGR ectMake(0, 0, 70, 100);
      • 3.创建所有子控件, 并且设置子控件的属性
      • UIImageView iv = [[UIImageView alloc] init];
      • iv.frame = CGRectMake(0, 0, 70, 70);
      • UILabel label = [[UILabel alloc] init];
      • label.frame = CGRectMake(0, 70, 70, 30);
      • 4.检查子控件是否有连线, 如果有就进行关联 self.iconView = iv; self.nameLabel = label;
      • 5.将所有子控件添加到父控件中 [shopView addSubview:iv]; [shopView addSubview:label];
    • 注意:
      • 如果是通过xib或者Storyboard创建一个控件, 不会调用initWithFrame方法
      • 如果是通过xib或者Storyboard创建一个控件,在"创建时"会调用initWithCoder方法,调用该方法时, 控件不一定被创建好
      • 如果是通过xib或者Storyboard创建一个控件,在"创建后"会调用awakeFromNib,调用该方法时, 证明控件已经创建好了