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. hdu5696区间的价值 -- 2016"百度之星" - 初赛(Astar Round2B)

    Problem Description 我们定义“区间的价值”为一段区间的最大值*最小值. 一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1). 现在聪明的杰西想要知道,对于长度为k的区 ...

  2. 推荐算法相关总结表(包括DM)

    推荐算法总结表 表1 推荐算法分类 个性化推荐算法分类 启发式算法 基于模型 基于内容 TF-IDF 聚类 最大熵 相似度度量 贝叶斯分类 决策树 神经网络 专家系统 知识推理 协同过滤 K近邻 聚类 ...

  3. application.properties 改成 application.yml

    application.properties 改成 application.yml

  4. 算法复习——欧拉回路(uoj117)

    题目: 题解: 欧拉回路相关定理(相关定义和证明请参见其他资料): 1.欧拉回路 (1)有向图:所有点的出度都等于入度为该图为欧拉图(存在欧拉回路)的充要条件. (2)无向图:所有点的度都为偶数为该图 ...

  5. HDU4612:Warm up(缩点+树的直径)

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Su ...

  6. HDU1542 扫描线+离散化

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. js实现游戏转盘抽奖

    <!DOCTYPE html> <html> <head> <title>js抽奖</title> <meta charset=&qu ...

  8. 自己实现KNN算法

    import numpy as np from math import sqrt from collections import Counter class KNNClassifier(object) ...

  9. dp优化-四边形不等式(模板题:合并石子)

    学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...

  10. 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼

    [题意]给定三个长度为n的排列,求在三个排列中顺序相同的数对个数. [算法]逆序对 [题解]很容易联想到NOIP火柴排队,涉及顺序问题显然和逆序对息息相关. 一个数对如果在三个排列中顺序不同,一定是1 ...