[How to] 使用Xib来创建view
1.简介
正如之前博客介绍的,xib可定义页面的某个部分,特别当此部分区域的view集中并且还有一些相互关联性(如隐藏等)是i特别适合使用xib来进行封装。
本文为[How to]使用自定义cell进行tableview的创建,适用于cell样式不发生变化的情况的后续。在本文中需要在tableview的footview中增加一个加载
按钮用于模拟加载更多数据的场景。如下图:

2.实现
1.创建xib文件

在xib中load more ing view为隐藏状态,对于进度圈也有特殊如下设置:

这是为了让进度圈在显式的时候旋转效果,在隐藏的时候停止旋转效果,以减少性能的损耗。
2.创建对应的view子类XFLoadMoreView
XFLoadMoreView.h
#import <UIKit/UIKit.h> // 创建按钮点击的处理协议 @class XFLoadMoreView; @protocol XFLoadMoreViewDelegate <NSObject> /** * 当按钮点击后通知代理实现对象 * * @param loadMoreView 触发者本身 */ @optional -(void) loadMoreViewDidClickedToLoadBtn:(XFLoadMoreView *) loadMoreView; @end @interface XFLoadMoreView : UIView // 代理属性,指向显示了此代理的对象,防止循环引用需要使用weak属性参数 @property (nonatomic,weak) id<XFLoadMoreViewDelegate> delegate; /** * 类初始化方法 * * @return 对象 */ +(instancetype) loadMoreView; @end
XFLoadMoreView.m
#import "XFLoadMoreView.h"
@interface XFLoadMoreView()
@property (weak, nonatomic) IBOutlet UIButton *loadMoreBtnView;
@property (weak, nonatomic) IBOutlet UIView *loadMoreIngView;
- (IBAction)loadMoreClick;
@end
@implementation XFLoadMoreView
/**
* 初始化方法
*
* @return load view
*/
+(instancetype) loadMoreView
{
// 直接从xib中加载view
XFLoadMoreView *loadView = [[[NSBundle mainBundle] loadNibNamed:@"XFLoadButton" owner:nil options:nil] lastObject];
// 美化按钮,将按钮的四个角圆润化
loadView.loadMoreBtnView.layer.cornerRadius = ;
loadView.loadMoreBtnView.layer.masksToBounds = YES;
return loadView;
}
/**
* 点击加载更多按钮后触发
*/
- (IBAction)loadMoreClick {
// 将botton隐藏让后将加载样式呈现
self.loadMoreBtnView.hidden = YES;
self.loadMoreIngView.hidden = NO;
// 使用此方法能够达到延迟执行效果
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
self.loadMoreBtnView.hidden = NO;
self.loadMoreIngView.hidden = YES;
// 向代理发送信息,由于是代理定义中设置的是可选方法,所以发送信息之前需要检查是否实现了此方法
if ([self.delegate respondsToSelector:@selector(loadMoreViewDidClickedToLoadBtn:)])
{
[self.delegate loadMoreViewDidClickedToLoadBtn:self];
}
});
}
@end
3.设置当前xib中view对应的类

并将按钮和加载view做代码连结处理。
4.Controller测的处理-实现代理
XFLoadMoreView类中定义了代理XFLoadMoreViewDelegate,在Controller测去实现此代理方法,藉此后续在xib中触发的点击事件后能够通知到Controller去处理。
@interface XFGoodsShowsViewController () <UITableViewDataSource, XFLoadMoreViewDelegate>
#pragma 重写foot view的代理方法
// 加载按钮按下后通知到此对象调用此方法
-(void) loadMoreViewDidClickedToLoadBtn:(XFLoadMoreView *) loadMoreView
{
// 这里我们模拟增加一个团购的信息,插入到列表的最好一行
XFGoodModel *model = [[XFGoodModel alloc] init];
model.image = @"image.jpg";
model.name = @"new food";
model.price = ;
model.soldNum = ;
// 将次信息插入到表数据源中
[self.goodsList addObject:model];
// 需要将此数据塞入table的最后一行
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.goodsList.count - inSection:];\
[self.goodsTableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// 加载完毕后将table滚到新加入的行那里,也就是最后一条
[self.goodsTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
5.Controller测的处理-初始化加载view并设定其代理对象
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// 指定tableview的数据代理
self.goodsTableView.dataSource = self;
// 加载tableView的footview
XFLoadMoreView *loadMoreView = [XFLoadMoreView loadMoreView];
// 设定view的代理为当前对象,时间发生后将通知当前对象
loadMoreView.delegate = self;
// 设定tableview的foot view属性
self.goodsTableView.tableFooterView = loadMoreView;
}
3.总结
本文最重要的是阐述当自定义view中发生事件后如何通过代理去通知Controller,这样做的目的就是自定义view与外部解耦,这样自定义view才具有通用性。
[How to] 使用Xib来创建view的更多相关文章
- IOS程序创建view
在IOS程序中创建view有六种方式 首先创建一个GLViewController类,继承UIViewController. 然后进入GLAppDelegate.m,在- (BOOL)applicat ...
- Android使用默认样式创建View的几个姿势
以下内容是分析安卓源码所得: 1: 使用默认样式创建View的方式, 源码文件 Button.Java 注:此文参考http://www.linzenews.com/ 中的内容所写,如侵删! 2: ...
- 使用xib方式创建UITableViewCell,设置Label自动换行注意事项
自定义的UITableViewCell,使用xib方式创建,想要其中的UILabel换行显示:计算Label的高度,让其自动换行,总是没有效果. 我猜测原因可能在于使用了autolayout布局.只要 ...
- VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池
VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...
- 在ASP.NET MVC中使用Knockout实践02,组合View Model成员、Select绑定、通过构造器创建View Model,扩展View Model方法
本篇体验使用ko.computed(fn)计算.组合View Model成员.Select元素的绑定.使用构造器创建View Model.通过View Model的原型(Prototype)为View ...
- 使用Java代码来创建view
使用Java代码来创建view 一.简介 需要了解的知识 二.方法 1)java代码创建view方法 * 1.先建view对象 View view= View.inflate(this, R.layo ...
- LinearLayout具体解释三:LayoutInflater创建View过程分析
上次讲到以下这么一段代码,这段代码的作用就是解析xml文件成为view并显示到屏幕上的. @Override //设置contentview,也就是activity或fragment载入视图,即vie ...
- 通过xib创建View
1 创建一个xib并使之与一个自定义的View相关联 2 在自定义的View中参考如下代码: - (id)initWithFrame:(CGRect)frame { self = [super ini ...
- 使用xib封装一个view的步骤
1.新建一个xib文件描述一个view的内部结构(假设叫做SSTgCell.xib) 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类, 取决于xib根对象的Class ...
随机推荐
- 【刷题】BZOJ 2038 [2009国家集训队]小Z的袜子(hose)
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub ...
- CF724E Goods transportation
最大流既视感 然后 TLEMLE既视感 然后 最大流=最小割 然后 dp[i][j]前i个点j个点在S集合,最小割 然后 dp[i][j]=min(dp[i-1][j]+p[i]+j*c,dp[i-1 ...
- ucenter通信实现同步登录、同步退出(详细)
首先,需要去官网下载一个ucenter的包.然后解压下来. 先把ucenter/ucenter这个文件夹复制到你的项目根目录下改名为uc_server;(这里只是我建议修改,以便于我下面写的配置); ...
- Balanced Sequence(毒瘤啊)排序贪心 HDU多校
Problem Description Chiaki has n strings s1,s2,…,sn consisting of '(' and ')'. A string of this type ...
- c# 深拷贝与浅拷贝的区别分析及实例
浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的. 深拷贝是指源对象与拷贝对象互相独 ...
- Web Service快速入门
一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 那么它是如何做到这种跨语言,跨平台之间的调用呢? 其实它是以一个xml文件以及webservice这种服务来实现跨平台 ...
- 转:为什么在定义hashcode时要使用31这个数呢?
散列计算就是计算元素应该放在数组的哪个元素里.准确的说是放到哪个链表里面.按照Java的规则,如果你要想将一个对象放入HashMap中,你的对象的类必须提供hashcode方法,返回一个整数值.比如S ...
- UVA 11040 Add bricks in the wall
https://vjudge.net/problem/UVA-11040 找规律 #include<cstdio> using namespace std; ][]; int main() ...
- UVA 1638 Pole Arrangement
https://vjudge.net/problem/UVA-1638 题意: n根长度分别为1,2,3,4……n的木棍 将这些木棍竖着排成一列 问从左边看能看到L根,从右边看能看到R根的方案数 将木 ...