[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 ...
随机推荐
- Selector 模型
1.服务器端: import selectors import socket sel = selectors.DefaultSelector() #生成一个select对象 def accept(so ...
- Linux相关——关于gdb的checkpoint & breakpoints指令
1,checkpoint ,,,这个指令简直,,,相见恨晚啊,居然现在才发现,.. 好吧来介绍一下这个指令:checkpoint(检查点) 我们调试程序,常常会出现好不容易发现了错误,却已经跑完那个地 ...
- POJ3686:The Windy's——题解
http://poj.org/problem?id=3686 题目大意: 有n个订单m个厂子,第i个订单在第j个厂子所需时间为zij,一个厂子做一个订单时不能做其他的订单. 求订单平均时间最小值. — ...
- POJ.1797 Heavy Transportation (Dijkstra变形)
POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...
- python多进程之Process
由于fork创建进程不能在windows系统上使用,所以产生了multiprocessing.Process Process可以直接实例化然后用start调用,需要指定新的进程执行的函数,用元组的方式 ...
- Linux之初试驱动20160613
这篇文章主要介绍一下Linux内核下的驱动结构与书写,以及介绍Linux下简单使用驱动的应用程序: 首先我们直接看使用驱动的简单应用程序: #include <sys/types.h> # ...
- Change FZU - 2277 毒瘤啊 毒瘤题目
There is a rooted tree with n nodes, number from 1-n. Root’s number is 1.Each node has a value ai. I ...
- Leetcode 557. 反转字符串中的单词 III
1.题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" ...
- IBM AppScan 安全漏洞问题修复(.net)
按问题类型分类的问题 使用 SQL 注入的认证旁路2 已解密的登录请求3 登录错误消息凭证枚举1 会话标识未更新2 跨站点请求伪造1 Missing "Content-Security-Po ...
- C语言预处理
1.由源码到可执行程序的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c- ...