[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 ...
随机推荐
- [洛谷P4070][SDOI2016]生成魔咒
题目大意:有一个字符串,每次在末尾加入一个字符,问当前共有多少个本质不同的字串 题解:$SAM$,就是问插入这个字符后,多了多少个字串,就是当前这个点的$Right$数组大小. 卡点:无 C++ Co ...
- java 实验四
北京电子科技学院(BESTI) 实 验 报 告 课程: Java 班级:1352 姓名:黄卫 学号:201352221 成绩: ...
- bzoj3810: [Coci2015]Stanovi(记忆化搜索)
实际上切出来的矩阵在原矩阵上的位置是不重要的...重要的只有矩阵的大小和上下左右是否在边界上. 于是我们可以设f[x][y][l][r][u][d]表示x*y的矩阵上下左右是不是边界的最小代价. 记忆 ...
- 51nod 1274 最长递增路径(DP)
一开始自己想了一种跑的巨慢..写了题解的做法又跑的巨快..一脸懵逼 显然要求边权递增就不可能经过重复的边了,那么设f[i]为第i条边出发能走多远就好了,这是我一开始的写法,可能dfs冗余状态较多,跑的 ...
- [学习笔记]分治FFT
一般的分治FFT是指: https://www.luogu.org/problemnew/show/P4721 考虑后面的f和前面的f有关系,但是贡献可以分着计算,逐一累计上去. 考虑cdq分治.算出 ...
- [LOJ 6159] 最长树链
看到要求gcd不为1所以肯定在这条答案链上都是一个质数的倍数,所以就会产生一个很暴力的想法 没错,正解就是这样的暴力 只让走是i(素数)倍数的点,作最长链 最长链可以树形dp或两遍bfs,一遍找端点, ...
- mysql主从同步加读写分离
首先主从同步,一旦建立,指定了用户,就不能更改了,否则会有错误.1063 Error 'Duplicate entry '%-test-' for key 'PRIMARY'' on query. D ...
- 爬虫实例——通过JS控制滚动条
案例 某位淘女郎的某个相册 有能力的童鞋可以先尝试一下爬取每张照片的链接. 我曾经尝试过几种方法,下面一一介绍: 第一种方法,采用requests和BeautifulSoup: import requ ...
- 轮廓算法的结果验证工具/How to validate the outline output
因为轮廓算法的结果通过直接观察输出很难判断结果的正确性. 但是如果把输入和输出同时绘制出来,用眼睛判别则相对简单许多. 输入建筑的文件内容格式为,粗体格式为建筑高度: 10 110 5020 60 7 ...
- Android 之 Spinner 键值对的绑定(转)
很多时候我们会在下拉菜单中绑定一个值,但是 Spinner本身不提供这样的服务 于是在网上找了N久,终于找到一个简单易用的方案;废话不多说,直接上菜了 首先要定义一个Item类,有以下要注意的: ...