前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发中 xib模块化设计

iOS开发中 xib模块化设计

作者头像
码客说
发布2019-10-22 14:31:16
8250
发布2019-10-22 14:31:16
举报
文章被收录于专栏:码客

前言

目标就是方便的将xib写的视图 方便的封装成一个组件来用

代码及使用方式

OC代码

ZJXibView.h

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface ZJXibView : UIView
@property(strong,nonatomic)UIView *contentView;
@end

ZJXibView.m

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import "ZJXibView.h"

@implementation ZJXibView

-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    [self loadView];
    return self;
}
-(void)awakeFromNib{
    [super awakeFromNib];
    [self loadView];
}

-(void)layoutSubviews{
    [super layoutSubviews];
    self.contentView.frame = self.bounds;
}

-(void)loadView{
    if(self.contentView){
        return;
    }
    
    NSString* clazzName = NSStringFromClass(self.classForCoder);
    NSArray* nameArray =[clazzName componentsSeparatedByString:@"."];
    NSString * xibName =nameArray[0];
    if(nameArray.count == 2){
        xibName = nameArray[1];
    }
    self.contentView = [[NSBundle mainBundle]loadNibNamed:xibName owner:self options:nil].firstObject;
    [self addSubview:self.contentView];
}

@end

Swift3代码

代码语言:javascript
复制
import UIKit

@objc class ZJXibView: UIView {
    
    @IBOutlet var contentView: UIView!
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.loadView()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.loadView()
        
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        self.contentView.frame = self.bounds
    }
    
    fileprivate func getXibName() -> String {
        let clzzName = NSStringFromClass(self.classForCoder)
        let nameArray = clzzName.components(separatedBy: ".")
        var xibName = nameArray[0]
        if nameArray.count == 2 {
            xibName = nameArray[1]
        }
        return xibName
    }
    
    
    func loadView() {
        if self.contentView != nil {
            return
        }
        let nibs = Bundle.main.loadNibNamed(getXibName(), owner: self, options: nil)
        self.contentView = nibs![0] as! UIView
        self.contentView.frame = self.bounds
        self.contentView.backgroundColor = UIColor.clear
        self.addSubview(self.contentView)
    }
}

使用方法

比如我们的xib名字为ZJUserPicView.xib 就必须建一个相同名字的类ZJUserPicView.swift并继承ZJXibView

ZJUserPicView.swift

代码语言:javascript
复制
import UIKit

class ZJUserPicView: ZJXibView {
    
    @IBOutlet weak var picImageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
}

ZJUserPicView.xibFile's Owner的Class指定为ZJUserPicView.swift 然后连接picImageViewnameLabel

这样ZJUserPicView就可以整体做一个组件来用了

完整示例

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 代码及使用方式
    • OC代码
      • Swift3代码
        • 使用方法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档