通过Xib自定义控件

加载xib的两种方式

  1. NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];
  2. UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil];   // nil 默认是mainBundle

    NSArray *array = [nib instantiteWithOwer:nil object:nil];

控制器拿到xib中控件的方法:

  • 遍历所有的子控件
  // 直接遍历子控件设置数据

 for (UIView *view in shopView.subviews) {

        if ([view isKindOfClass:[UIImageView class]]) {

            UIImageView *imageView = (UIImageView *)view;

            imageView.image = [UIImage imageNamed:shop.icon];

        } else if ([view isKindOfClass:[UILabel class]]) {

            UILabel *label = (UILabel *)view;

            label.text = shop.name;

        }

    }
  • 绑定tag
// 通过tag拿到对应的子控件设置数据

    UIImageView *iconImageView = (UIImageView *)[shopView                  viewWithTag:1];

    iconImageView.image = [UIImage imageNamed:shop.icon];

    UILabel *nameLabel = (UILabel *)[shopView viewWithTag:2];

    nameLabel.text = shop.name;

自定义xib的步骤:

  1. 创建一个ShopView,xib和其文件名保持一致(名字随便取,建议有意义一点)
  2. 在Xib中,xib的类从UIView改成ShopView
  3. 给内部的子控件设置数据
  4. 提供类方法封装xib的加载过程
+ (instancetype)shopView

{

    return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];

}

+ (instancetype)shopViewWithShop:(Shop *)shop

{

   //创建shopView   ShopView *shopView = [self shopView];  //给shopView设置数据
  shopView.shop = shop;
  return shopView;

}

xib的加载原理

  • 一层一层的解析转为对应的代码
- (void)loadXib

{

    XMGShopView *shopView = [[XMGShopView alloc] initWithCoder:nil];

    shopView.frame = CGRectMake(0, 0, 70, 90);

    shopView.backgroundColor = [UIColor whiteColor];

    UIImageView *iconImageView = [[UIImageView alloc] initWithCoder:nil];

    iconImageView.backgroundColor = [UIColor greenColor];

    iconImageView.frame = CGRectMake(0, 0, 70, 70);

    [shopView addSubview:iconImageView];

    self.iconImageView = iconImageView;

    XMGLabel *nameLabel = [[XMGLabel alloc] initWithCoder:nil];

    nameLabel.backgroundColor = [UIColor greenColor];

    nameLabel.frame = CGRectMake(0, 0, 70, 70);

    [shopView addSubview:nameLabel];

    self.nameLabel = nameLabel;    

}
  • xib中的控件是什么类型,加载出来就是什么类型
  • xib中的子控件是什么类型,脱线出来就是什么类型
  • 通过alloc/init或者alloc/initWithFrame创建控件不会主动加载xib,即使xib的名称和控件的类名一样

注意点:

  • 如果是通过代码创建的控件,初始化时一定会调用initWithFrame
  • 如果是通过xib或者storyboard创建控件,初始化时是不会调用initWithFrame,会调用initWithCoder
  • 如果是通过xib或者storyboard创建控件,初始化完毕后会调用awakeFromNib方法
  • 建议在awakeFromNib中做初始化

原文地址:https://www.cnblogs.com/wwjwb/p/12650271.html

时间: 2024-08-08 12:36:17

通过Xib自定义控件的相关文章

iOS中MVC常用的结构策略

模型 概念 专门用来存放数据的对象 特点 一般直接继承自NSObject 在.h文件中声明一些用来存放数据的属性 模型定义示例 @interface Shop : NSObject /** 名字 */ @property (nonatomic, strong) NSString *name; /** 图标 */ @property (nonatomic, strong) NSString *icon; @end 字典转模型示例 Shop *shop = [[Shop alloc] init];

应用管理的实现

1 1.加载应用信息: 2 1.1.直接在controller里进行懒加载:(get方法) 3 1.1.1.先判断是否已经加载数据:if (array == nil) 4 1.1.2.先找到plist文件的路径:NSString *path = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"]; 5 1.1.3.然后从文件中读取数据:array = [NSArray arrayWithCon

Plist文件和字典转模型

模型与字典 1. 用模型取代字典的好处 使用字典的坏处 编译器没有自动提醒的功能,需要手敲 key如果写错了编译器也不会报错 2. 模型概念 概念 专门用来存放数据的对象 特点 一般继承自NSObject 在.h文件中声明一些用来存放数据的属性 注释 //单行注释 / /多行注释 /* /文档注释,调用属性时会显示出来文档注释 使用模型的好处 模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性 使用模型访问属性的时候,编译器会提供一系列的提示,提

自定义控件设置属性并实时展现并预览在xib中

关键字: // @IBDesignable:实时看到xib设置后的效果 // @IBInspectable:给xib提供设置属性,可以xib中看到此属性 场景: 自定义一个UITextField,并提供borderColor.borderWidth.cornerRadius三个属性: 要求:这三个属性能够展现在xib中,改变属性值,能实时预览效果. 1.我们先自定义类: 1 import UIKit 2 3 // @IBDesignable:实时看到xib设置后的效果 4 @IBDesignab

xib和storyboard的区别

storyboard: 重量级 用来描述整个App的多个软件 User Interface -> Storyboard xib: 轻量级 用来描述一个界面,通常是自定义控件 User Interface -> Empty 打包之后叫nib 使用时没有设置尺寸,默认为xib描述的尺寸 加载xib的方式: 常用: UIView * nibView = [[[NSBundle mainBundle] loadNibNamed:@"nibName" owner:nil option

iOS边练边学--xib文件初使用

一.Xib和storyboard对比 *共同点: 1>都用来描述软件界面 2>都用Interface Builder工具来编辑 3>本质都是转换成代码去创建控件 *不同点 1>Xib是轻量级的,用来描述局部的UI界面 2>storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系 二.Xib的加载方法 方法1: NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名

iOS开发——UI高级OC篇&自定义控件之调整按钮中子控件(图片和文字)的位置

自定义控件之调整按钮中子控件(图片和文字)的位置 其实还有一种是在storyBoard中实现的,只需要设置对应空间的左右间距: 这里实现前面两种自定义的方式 一:imageRectForContentRect/titleRectForContentRect 自定义一个按钮控件在系统自带的位置设置方法中实现对应子控件位置调整 1 /** 2 3 * 设置内部图标的frame 4 5 */ 6 7 - (CGRect)imageRectForContentRect:(CGRect)contentRe

iOS-xib(使用XIB实现嵌套自定义视图)

参考:http://wtlucky.github.io/geekerprobe/blog/2014/08/10/nested-xib-views/?utm_source=tuicool 因为主要练习xib就使用xib上的方式 1.首先创建一个自定义视图类 2.清除view的链接(没有进行这一步的略过),保证为上面的格式 3.建立新的链接 在这里添加新的链接 这是拖拽过去的,你懂的- 4.在CustomView.m重新view的- (id)initWithCoder:(NSCoder *)aDec

自定义View控件(1—xib实例代码)

/** * 1. 设置显示到控制器上的模型数据(根据plist文件设置其属性,然后定义与实现工厂方法来快速实现字典转模型) */   // 1. 模型Shop.h文件 @interface Shop : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *icon; - (Shop *)initWithDict:(NSDictionary *)dict; +