plist文件和xib文件的加载方法

如果想要一个对象一初始化出来属性中就有某些值,那么我们就可以重写他的构造方法(init方法)

- (instancetepy) init{

     if(self=[super  init]){
              //初始化属性
              }
              return  self;
}

懒加载

  • 数据用到时才加载

为了防止重写控件初始化方法不成功,会采用下面这样的双保险写法只要才用这种写法,无论控件是如何创建的都会成功重写控件的初始化方法

/**
 *控件属性设置方法
 */
- (void) setup
{
    //初始化控件的那些属性
}
/**
 *重写控件initWithFrame:(CGRect)frame初始化方法,
 这个方法只要控件是通过代码创建的,那么就会在控件初始化时调用这个方法
 */
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self=[super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}
/**
 *重写控件awakeFromNib初始化方法,
 这个方法只要控件是通过Xib或storyboard创建的,那么就会在控件初始化时调用这个方法
 */
- (void)awakeFromNib
{
    [self setup];
}

通过代码创建自定义控件

  • 通过创建类,来写一个自定义控件,并且继承于系统自带的控件
  • 目的:封装控件内部的细节,不让控制器知道
  • 步骤:
    • 新建一个继承系统控件的类
    • 在initWithFrame方法中添加子控件
    • 在layoutSubviews方法中这只子控件的frame
      • 在layoutSubview方法中,一定要调用[super layoutSubviews]
    • 提供一个模型属性,重写模型属性的set方法
      • 在重写set方法中,取出模型的属性给对应子控件赋值

通过Xib自定义控件

  • 新建一个继承自系统控件的自定义控件类
  • 新建一个Xib文件 (文件名一定要和自定义控件类类名一致,方便别人阅读代码)
    • 修改xib主控件的Class类名,和他相匹配的自定义控件类名一致
    • 往主控件中添加子控件,设置子控件属性
    • 在自定义控件的.m文件中,添加类扩展
    • 通过xib到自定义控件类.m文件类扩展的连线,把xib子控件添加到类扩展的属性中
  • 在自定义控件类.h文件中添加模型属性,重写模型属性的set方法
    • 在重写set中,把模型的属性赋值给子控件

通过以上对比我们得出结论

  • 通过xib自定义控件相比于通过代码自定义控件,节省了两个步骤
    1.减少了通过initWithFrame方法中添加子控件的步骤
    2.减少了通过layoutSubviews方法中这只子控件的framed步骤

plist文件和xib文件的加载方法

  • 获取plist文件的全路径方法
    • 用到了- (nullable NSString *)pathForResource:(nullable NSString *)name ofType:(nullable NSString *)ext;
    NSString * file=[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];
    //把plist文件中的数组给dictArray
    NSArray * dictArray=[NSArray arrayWithContentsOfFile:file];
  • 获取xib文件的全路径方法
  • 获取xib文件的方法:- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
    WLSubView *subView=[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self)
    owner:nil options:nil] firstObject];

神奇三部曲给结构体赋值

    CGRect  tempFrame=self.imageView.frame;
    tempFrame.size.width=0;
    tempFrame.size.height=0;
    self.imageView.frame=tempFrame;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容