搜索
您的当前位置:首页正文

xib(自定义控件)

来源:二三娱乐

1.创建xib文件,--(与你实例化那个控件的名字相一致)

  • 加载xib文件的实质是创建控件,包括父控件与子控件。
    假如xib里面有一个shopView ,子控件是UIImage与UILable控件。
    xib实现相当于代码(根据拖进去控件类型选择类方法)
if(self=[super init])(代码创建)
UIImageView *iconView= [[UIImageView alloc]init];
UILabel *laberView = [[UILabel alloc]init];
还有frame略去

2.父控件是与名字一样的那个类,加载的时候创建的是这个类型。这个类型里有模型数据属性。

  • 2.1 拿到模型数据,可以用tag拿到子控件,对子控件进行给数据。
UIImageView  *iconView = [(UIImageView  *)[self viewWithTag:5];
  • 2.2.采取IBOutlet拿到子控件 (只能连接到父控件)
@property(nonatomic,strong)IBOutlet UIImageView  * iconView;
/** 名字控件 */
@property(nonatomic,strong)IBOutlet UILabel * lableView;

3.加载xib文件


    shopView *yhshopview = [[[NSBundle mainBundle] loadNibNamed:@"shopView" owner:nil options:nil] lastObject];
  • 3.1最好屏蔽到输入的文件名字,防止出现错误,同事之间减少沟通成本。
  • 方法一写一个类方法
+(NSString *) xibName
    {
 return NSStringFromClass(self);

   } 
  • 方法二直接将加载写到类方法中。
+(instancetype)shopView{
return [[[NSBundle mainBundle] loadNibNamed:  NSStringFromClass(self);
 owner:nil options:nil] lastObject];
}

4.为通过xib文件创建的控件初始化

 - 4.1 通过可视化在右边的边框里设置,缺点设置有限。
 - 4.2 一般想到用init方法例如:
-(instantype)initWithFrame:(CGRect)frame{
  if(self =[super initWithFrame:frame])
 {
    self.backgroundColor = [UIColor  redColor];
  }
   return self;
}

首先通过xib创建的控件是不会调用上面这个方法。
- 4.3 调用的是

  -(id)initWithCode:(NSCoder*) aDecoder{//这个是创建时,会调用。有些时候有些属性还不存在,所以不靠谱。
       if(self = [super initWithColor:aDecoder]){
          self.scrollView.backgroudColor = [UIColor redColor];
         
        }
       return self;
 }

最好调用awakeFromNib
```
- (void)awakeFromNib{
self.srollView.backgroundColor =[UIColor redColor];
}

    ```

5.自定义控件的时候 ——不管是通过xib/story和代码创建控件最好在awakeFromNib和initWithFrame:(CGRect)frame里都将初始化的代码加上去。这样可以不管是通过什么方式创建的代码都会被初始化。

Top