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的更多相关文章

  1. IOS程序创建view

    在IOS程序中创建view有六种方式 首先创建一个GLViewController类,继承UIViewController. 然后进入GLAppDelegate.m,在- (BOOL)applicat ...

  2. Android使用默认样式创建View的几个姿势

    以下内容是分析安卓源码所得: 1: 使用默认样式创建View的方式, 源码文件 Button.Java  注:此文参考http://www.linzenews.com/ 中的内容所写,如侵删! 2: ...

  3. 使用xib方式创建UITableViewCell,设置Label自动换行注意事项

    自定义的UITableViewCell,使用xib方式创建,想要其中的UILabel换行显示:计算Label的高度,让其自动换行,总是没有效果. 我猜测原因可能在于使用了autolayout布局.只要 ...

  4. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  5. 在ASP.NET MVC中使用Knockout实践02,组合View Model成员、Select绑定、通过构造器创建View Model,扩展View Model方法

    本篇体验使用ko.computed(fn)计算.组合View Model成员.Select元素的绑定.使用构造器创建View Model.通过View Model的原型(Prototype)为View ...

  6. 使用Java代码来创建view

    使用Java代码来创建view 一.简介 需要了解的知识 二.方法 1)java代码创建view方法 * 1.先建view对象 View view= View.inflate(this, R.layo ...

  7. LinearLayout具体解释三:LayoutInflater创建View过程分析

    上次讲到以下这么一段代码,这段代码的作用就是解析xml文件成为view并显示到屏幕上的. @Override //设置contentview,也就是activity或fragment载入视图,即vie ...

  8. 通过xib创建View

    1 创建一个xib并使之与一个自定义的View相关联 2 在自定义的View中参考如下代码: - (id)initWithFrame:(CGRect)frame { self = [super ini ...

  9. 使用xib封装一个view的步骤

    1.新建一个xib文件描述一个view的内部结构(假设叫做SSTgCell.xib) 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的Class ...

随机推荐

  1. CentOS 访问控制列表(tcp wrappers)

    1.TCP Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用.比如说ssh.telnet.FTP等服务的请求,都会先受到TCP Wrappers的拦截. ...

  2. 获取接口参数名带有“abc”的参数的值

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) va ...

  3. LibreOJ #6190. 序列查询(线段树+剪枝)

    莫队貌似是过不了的,这题是我没见过的科技... 首先区间按右端点排序,然后一个扫描线,扫到某个区间右端点时候计算答案,线段树上节点的信息并不需要明确定义,我们只要求线段树做到当前扫到now时,查询[L ...

  4. python获取当前工作目录

    py文件所在位置/test/pj/hello.py 用户所在位置:/ 用户执行命令python /test/pj/hello.py 1. os.getcwd() 返回的是执行命令的位置 / 2.sys ...

  5. 总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)

    犀利的开头 在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模 ...

  6. Codeforces Round #333 (Div. 2) B

    B. Approximating a Constant Range time limit per test 2 seconds memory limit per test 256 megabytes ...

  7. Codeforces Round #514 (Div. 2):D. Nature Reserve(二分+数学)

    D. Nature Reserve 题目链接:https://codeforces.com/contest/1059/problem/D 题意: 在二维坐标平面上给出n个数的点,现在要求一个圆,能够容 ...

  8. bzoj 2086 [Poi2010]Blocks 单调栈

    [Poi2010]Blocks Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 788  Solved: 356[Submit][Status][Dis ...

  9. SQL Server2000安装教程图解

    sql2000安装教程图解... ================================= 第一部分:下载所需要的安装包: 可以自己在网上百度了之后下载--或是直接从我已打包好的群里下载 = ...

  10. oracle xml操作

      /*=====================生成\修改xml========================= */ --xmlelement多个标签层级 SELECT XMLELEMENT(& ...