文档章节

iOS开发之使用xib自定义View的步骤

shenhuniurou
 shenhuniurou
发布于 2016/03/03 22:42
字数 841
阅读 23
收藏 0

1、首先创建一个view对象文件继承自UIView

2、再创建一个xib文件,命名和自定义view相同(其实Xcode创建view文件的时候就有一个选项提示:Also create XIB file,我猜想是创建View文件时同时创建同名的xib文件,但是现在是无法勾选的,我还不知道原因,所以现在只能单独创建),注意要选择User Interface里面的View

这样就得到了三个同名的文件(我就以Book为例)


3、修改xib文件中的类名,因为我们原先创建的xib文件是UIView类型,但是要把它改成我自定义的view类型

把UIView改成我刚刚创建的自定义View名:XXBookView

4、把xib的加载过程封装到自定义view的构造方法中,还要给自定义view增加一个XXBook的模型属性,用来设置数据。

模型XXbook:

//
//  XXBook.h
//  CustomViewWithXib
//
//  Created by Daniel on 16/3/3.
//  Copyright © 2016年 Daniel. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface XXBook : NSObject

/** 图书封面 */
@property(nonatomic, strong) NSString *bookImage;

/** 图书作者 */
@property(nonatomic, strong) NSString *bookAuthor;

/** 图书价格 */
@property(nonatomic, strong) NSString *bookPrice;

@end

自定义View:

//
//  XXBookView.h
//  CustomViewWithXib
//
//  Created by Daniel on 16/3/3.
//  Copyright © 2016年 Daniel. All rights reserved.
//

#import <UIKit/UIKit.h>
@class  XXBook;

@interface XXBookView : UIView

/** 图书模型属性 */
@property(nonatomic, strong) XXBook *book;

+ (instancetype)bookView;

+ (instancetype)bookViewWithBook:(XXBook *)book;


@end
//
//  XXBookView.m
//  CustomViewWithXib
//
//  Created by Daniel on 16/3/3.
//  Copyright © 2016年 Daniel. All rights reserved.
//

#import "XXBookView.h"
#import "XXBook.h"

@implementation XXBookView

+ (instancetype)bookView {
    
    return [self bookViewWithBook:nil];
    
}

+ (instancetype)bookViewWithBook:(XXBook *)book {
    
    //这里用同名xib的好处就体现了,用NSStringFromClass方法获得的类名也就是xib文件名,不用手动输,避免写错
    XXBookView *bookView = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
    
    bookView.book = book;
    return bookView;
    
}


@end

5、在类扩展中增加子控件属性,关联xib中的子控件

//
//  XXBookView.m
//  CustomViewWithXib
//
//  Created by Daniel on 16/3/3.
//  Copyright © 2016年 Daniel. All rights reserved.
//

#import "XXBookView.h"
#import "XXBook.h"

/** 类扩展中增加子控件属性,关联xib中的子控件 */
@interface XXBookView()

@property (weak, nonatomic) IBOutlet UIImageView *bookView;

@property (weak, nonatomic) IBOutlet UILabel *authorLable;

@property (weak, nonatomic) IBOutlet UILabel *priceLable;

@end

@implementation XXBookView

+ (instancetype)bookView {
    
    return [self bookViewWithBook:nil];
    
}

+ (instancetype)bookViewWithBook:(XXBook *)book {
    
    //这里用同名xib的好处就体现了,用NSStringFromClass方法获得的类名也就是xib文件名,不用手动输,避免写错
    XXBookView *bookView = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
    
    bookView.book = book;
    return bookView;
    
}


@end

6、模型属性的setter方法中将数据设置到子控件上去。

//
//  XXBookView.m
//  CustomViewWithXib
//
//  Created by Daniel on 16/3/3.
//  Copyright © 2016年 Daniel. All rights reserved.
//

#import "XXBookView.h"
#import "XXBook.h"

/** 类扩展中增加子控件属性,关联xib中的子控件 */
@interface XXBookView()

@property (weak, nonatomic) IBOutlet UIImageView *bookImage;

@property (weak, nonatomic) IBOutlet UILabel *authorLable;

@property (weak, nonatomic) IBOutlet UILabel *priceLable;

@end

@implementation XXBookView

+ (instancetype)bookView {
    
    return [self bookViewWithBook:nil];
    
}

+ (instancetype)bookViewWithBook:(XXBook *)book {
    
    //这里用同名xib的好处就体现了,用NSStringFromClass方法获得的类名也就是xib文件名,不用手动输,避免写错
    XXBookView *bookView = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject];
    
    bookView.book = book;
    return bookView;
    
}

//setter方法:将数据设置到子控件上去
- (void)setBook:(XXBook *)book {
    
    _book = book;
    
    //设置子控件的数据
    self.bookImage.image = [UIImage imageNamed:book.bookImage];
    self.authorLable.text = book.bookAuthor;
    self.priceLable.text = book.bookPrice;
    
}


@end

当然,数据在模型的自定义构造方法中加载就行了,在ViewController中添加这个自定义view就行了

[self.view addSubview:[XXBookView bookView]];

运行的效果图:

我没有在模型中加载数据,所以看到view只有我手动改的背景色和文字。


© 著作权归作者所有

共有 人打赏支持
shenhuniurou
粉丝 20
博文 78
码字总数 63826
作品 0
广州
Android工程师
私信 提问
使用 Interface Builder 兼容 iOS6 和iOS7

当你在更新你的App到iOS 7的平台时遇到最大的挑战之一就是确保不要遗忘那些还在使用iOS 6平台的用户,在此我们提供一些建议使你的App应用在iOS 6和iOS 7上同时保留视觉吸引力和技术功能. 此图...

isaced
2014/01/15
13.3K
12
mac os安装xcode和ios sdk4.2版本

这两天刚刚使用mac系统,个人感觉比起windows7一个显著的优点就是关机速度特别快。当然在安装mac系统时,如果选择IT用户,很多开发系统也就自动安装好了,比如jdk、maven、svn,python的环境...

鉴客
2011/12/14
10.8K
3
iOS一些代码的取巧写法总结(二)

一、在xib/storyboard里面设置view圆角半径 在xib/storyboard里面设置view圆角半径 神奇的IB_DESIGNABLE和IBInspectable(xib中设置圆角) 二、push pop 动画突然消失的解决方案 产生的原因是动...

朝雨晚风
2016/12/05
0
0
IOS代码实现Hello World

前面写的IOS笔记一直都是用Xib文件实现的小Demo开发,但是问了好几个现在正从事IOS开发的朋友,在实际开发,并不是所有的项目都会用Xib来实现的,因为IOS以前的版本不能正常运行,因为还在学...

长平狐
2012/10/25
129
0
iOS XIB使用Safe Area后在iOS9和10上面出现的问题和解决方案

本文由 送你的独白么 原创,转载请注明出处! 导语 普大喜奔,苹果爸爸在9.20号发布了新的iOS 11系统和iPhone手机,作为iOS 开发者,第一件事是什么,当然是买iPhoneX啦------我这个穷逼并不...

壹峰
12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何解决 homebrew 更新慢的问题

之前一直困扰于 Homebrew 的更新速度,曾试过修改更新源(清华、中科大等)的方式,但是并没什么卵用;也试过设置 curl 代理的方式,但是 brew 走的好像不是 curl 的方式,所以也没用。 通过...

whoru
11分钟前
0
0
TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

简介 TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速度可达到传统执行 SQL 导入方式的至少 3 倍、大约每小时 100 GB,适合...

TiDB
12分钟前
0
0
【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton

概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一。它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈现更加直观)。...

葡萄城技术团队
15分钟前
0
0
Maven环境隔离

Maven环境隔离 1. 什么是Maven环境隔离 顾名思义,Maven环境隔离就是将开发中的环境与beat环境、生产环境分隔开,方便进行开发和维护。这个在实际项目中用的还是很多的,如果你的项目用的Mav...

蚂蚁-Declan
15分钟前
1
0
day182-2018-12-19-英语流利阅读-待学习

“性感”时代已去,维密将如何转身? Daniel 2018-12-19 1.今日导读 维多利亚的秘密(Victoria's Secret)这个内衣品牌,最近似乎步入了“中年危机”——曾经打遍天下的“性感”内衣,在主打...

飞鱼说编程
15分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部