iOS 给UIView添加单独XIB文件

首先说明我不知道这个方法,有没有人知道或者已经玩熟了。但这个东西是我自己想出来。
1给UIView配置单独的XIB

好,我们废话不多说开始,这种方式是我在做一个极其复杂的弹出视图时想出来的,也是用来做这个的,如果是一个ViewController的话感觉不合适所以才决定在这么做的。

第一步1 我们需要新建一个UIView的类,我们看到这里的xib是勾选不了的。我们要做就是让它有xib文件
图片描述

然后我们新建一个和这个类名一样的XIB文件command+n 选择User interface 里面的View 记住这里的名字一定要和刚才我们新建的UIView类相呼应要一致
图片描述
图片描述
OK 我们的准备工作已经做完了,一共三个文件 HeaderView_Test.h HeaderView_Test.m HeaderView_Test.xib 确定有了这三个文件之后我们就可以做配置了

我们打开xib文件 看到一个大方块的View 我一般会选择最小的适配3.5英寸的为了适配Iphone4 宽度320高度480的设备 选择这种是弹出窗口会占用整个视图的我们也可以选择大的,反正视图里面想怎么用想怎么玩都可以。不要限制。

然后我们选择右边第三个检查器有的人也叫属性配置器或者控件配置区,不管它叫什么我们选择第三个 然后看到第一个配置的是 Custom Class 好我们就动它 默认的是UIView类。我们在这里填上我们刚才新建的UIView类 HeaderView_Test 然后回车让它确认这个View是继承自我们选择的类
图片描述
OK 完成了这里剩下的就是代码部分了。

我们回到HeaderView_Test.h 文件中定义一个静态方法 也就是类方法 。让其返回一个自己类对象本身

+(HeaderView_Test*)AcquireCustomView;

我们不需要传任何参数只需要返回对象本身,经过这个方法处理完的对象本身是经过xib 初始化出来的,这就是这种方式的关键点,我们不需要用代码加约束和代码写子View。要做的就是像普通ViewController的xib文件一样画你需要的视图和操作正常XIB一样
图片描述
好 ,我们随便拖两个按钮或者什么其他的鬼东西,一般是弹出视图所以我们需要 背景是毛玻璃 你可以直接调整View的颜色,也可以放张ImageView做底放一张毛玻璃的图片,然后把控件放在imageView上面 我这里是测试一个TableView的HeaderView 所以放的比较小。你们按需求来做。

到了这里,我们开始写关键代码在我们HeaderView_Test.m文件中实现我们刚才声明的方法
图片描述

+(HeaderView_Test*)AcquireCustomView
{
//我们这里需要把这个xib加载出来而这个xib的所拥有者就是当前的对象`instantiateWithOwner:`这个方法就是对此xib文件进行拥有者关联,关联这个xib是属于哪一个类的我们当然这是self
 HeaderView_Test*View = [[UINib nibWithNibName:@"HeaderView_Test" bundle:nil]instantiateWithOwner:self options:nil].lastObject;
    
    return View;
}

现在验证一下我们的类和这个xib有没有关联,其实早就关联了只不过这里才是关联实例化这个xib里面控件的关键步骤。理论上也是实例化xib里面的控件也是通过上面的代码的完成的 。

我们从刚才的xib里面拖根线 定义一个属性给这个当前类HeaderView_Test
图片描述

是不是可以了,我们现在定义这些属性。这里讲一点我无意间发现的一个奇怪的东西。其实我们连线然后去掉线,其实相当于给这个类定义了一个属性,只不过没有实例化而已,如果实例化了这个被断掉线的属性的话,其实也可以用,这个东西等完了说这个讲起来有点麻烦要看图。

好我们继续,现在我们只是把这个View给创建并连接了所拥有控件当做此类的属性,现在我们就来用他。

我们新建一个ViewController或者你们已经有的视图控制器。想要哪里显示出来就在哪里。到达你们要填加父视图.m文件中 我们首先整一个属性把这个我们新建的View类当做里面的一个属性

@property(nonatomic,strong)HeaderView_Test*HeaderView;

现在我们去懒加载一次这个View

-(HeaderView_Test*)HeaderView
{
    
    if (!_HeaderView) {
        _HeaderView = [[HeaderView_Test AcquireCustomView]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    }
    return _HeaderView;
    
}

因为我们新建的View类是继承于UIView的所以本身就有初始化方法,所以我们不需要重写除非你想在初始化的时候想修改下xib里面控件的layer或者其他什么初始化值之类的。

  • (instancetype)initWithFrame:(CGRect)frame
    {

       self = [super initWithFrame:frame];
       if (self) {
       //如果子视图只需要配置一次然后一直就是那个样子就写在初始化方法里面
           <#statements#>
       }
       return self;

    }

其实也可以在这个方法里面写都可以。

  • (void)drawRect:(CGRect)rect {

    
    //这里面写你对子视图的初始配置 是后期还要调用的就写在这里面
    
    
    

    }

如果你想在特定的时候需要重新设定子控件为初始状态的话,就写在这个方法里面。然后在想要恢复原貌或者初始值得时候调用 [_HeaderView setNeedsDisplay];View的这个方法会自动调用这个drawRect:(CGRect)rect 方法。给你的子控件重新布局或者恢复原貌赋初始值。
然后用的时候直接调用静态方法或者类方法[HeaderView_Test AcquireCustomView]这个返回的就是一个我们自定义Xib关联的实例对象
图片描述
ok 我们就简单的介绍到这里。其他的就靠自己领悟了,其实习惯了之后。这种方式有很大的用处的。就看你们的发觉了。里面涉及的逻辑我们可以建一个ViewModel的类来管理。或直接在里面操作。或者直接在你所在父视图控制器操作 。ViewController可以做到这个都可以做到。而且这个在不同的需求里面。有着不同的效果。项目需要的时候就会想起了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值