使用xib加载View的小技巧

本人在开发中比较喜欢用 xib 来作布局,通常情况下,我们需要把一些常用的 view 封装成组件来供大伙儿使用。但是这个组件一般只是负责 view 层的展示任务,事件相关的业务逻辑需要转发到相应的 controller 里面去。这里介绍一下本人使用的一种方法。

直接上代码

BaseView 基类

BaseView

@interface BaseView : UIView
+ (instancetype)loadViewFromNib;
+ (instancetype)loadViewFromNibWithOwner:(id)owner;
@end

@implementation BaseView
+ (instancetype)loadViewFromNib{
BaseView* view = [[self alloc]init];
UIView* nibView = [self viewFromNibNamed:NSStringFromClass([self class]) owner:view];
view.frame = nibView.frame;
[view addSubview:nibView];
return view;
}
+(instancetype)loadViewFromNibWithOwner:(id)owner{
return [self viewFromNibNamed:NSStringFromClass([self class]) owner:owner];
}
+(instancetype)viewFromNibNamed:(NSString*)nibName owner:(id)owner{
NSArray* nibView = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil];
return [nibView firstObject];
}
@end

MyView 组件

首先建一个 BaseView 的子类,和对应的 xib 文件

MyView.h
MyView.m
MyView.xib

MyView.h

@protocol MyViewActionProtocol <NSObject>
- (IBAction)loginAction:(id)sender;
@end

@interface MyView : BaseView<MyViewActionProtocol>
@property (nonatomic, weak)IBOutlet UIButton* loginButton;
@end

在 MyView.xib 中,把 file’s owner 设置为 MyView,同时把 view 的 custom class 设置为 MyView。

接下来就是做关联了:

  • 关联属性的时候需要把 xib 中的 button 与 view 的 loginButton 关联
  • 关联事件的时候需要把 xib 中的 button 的事件与 File's Owner 的 loginAction 关联

这样就做好了一个 MyView 组件了

使用 MyView

在 MyViewController 中我们要加入这个 MyView,可以通过如下方式

首先,让 MyViewController 实现 MyViewActionProtocol 协议

然后在 viewDidLoad 的时候如下方式加入 MyView

MyView* view = [MyView loadViewFromNibWithOwner:self];
[self.view addSubview:view];

这样,view 中的事件处理就可以直接放到 MyViewController 里面去了,但是 view 的渲染我们照样可以在 MyView 中进行。
比如,我要设置 loginButton 的样式,可以在 MyView 里面写如下代码

- (void)layoutSubviews{
[_loginButton setBackgroundColor:[UIColor redColor]];
}

而且在 MyViewController 中照样可以引用到 MyView 里面的属性

参考

iOS开发之xib技巧介绍