type
Post
status
Published
date
Nov 19, 2015
slug
summary
tags
iOS
category
技术分享
icon
password
本人在开发中比较喜欢用 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 里面的属性