效果展示

project下载地址

·

进入构建结构

首先我们新建一个project

接下来我们拖进来一个Table View Controller,将Storyboard Entry Point指向我们的Table View Controller。

原来的ViewController就能够删除了。

效果如图所看到的

选中Table View Controller,点击上面菜单条中Editor->Embed in->Navigation Controller

主要的工作我们都做完了。能够讲project中无用的东西都能够删除了,方便我们进行编写东西

主题(代码编写)

在这里我进行代码的编写,讲述主要部分,后面会把完整的项目给出

构建LDEntity用来初始化字典,进行Json数据的解析

LDEntity.h

#import <Foundation/Foundation.h>

@interface FDFeedEntity : NSObject

- (instancetype)initWithDictionary:(NSDictionary *)dictionary;

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *content;
@property (nonatomic, copy) NSString *username;
@property (nonatomic, copy) NSString *time;
@property (nonatomic, copy) NSString *imageName; @end

-(instancetype)initWithDictionary:(NSDictionary *)dictionary方法的详细实现,返回本身类型

LDEntity.m

#import "FDFeedEntity.h"

@implementation FDFeedEntity

- (instancetype)initWithDictionary:(NSDictionary *)dictionary
{
self = super.init;
if (self) {
self.title = dictionary[@"title"];
self.content = dictionary[@"content"];
self.username = dictionary[@"username"];
self.time = dictionary[@"time"];
self.imageName = dictionary[@"imageName"];
}
return self;
} @end

以上代码的功能主要是为了解析JSON数据

构建我们的Main.storyboard

选中Table View更改Style为Grouped

设计出以下样式,而且使用 auto layout进行约束

接下来编写cell

新建LDCell 继承 UITableViewCell

将Main.storyboard中TableView中的Cell的Identifier设置为LDCell,而且关联LDCell

LDCell.h

构建一个LDEntity对象解析数据

#import <UIKit/UIKit.h>
#import "LDEntity.h" @interface LDCell : UITableViewCell @property(nonatomic,strong)LDEntity *entity; @end

将刚才的全部控件与LDCell.m关联

在LDCell.m中构建entity的set方法,还有须要注意的是假设你没有使用auto layout,你须要重写约束方法

LDCell.m

#import "LDCell.h"

@interface LDCell ()
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *contentLabel;
@property (weak, nonatomic) IBOutlet UIImageView *contentImageView;
@property (weak, nonatomic) IBOutlet UILabel *usernameLabel;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel; @end @implementation LDCell - (void)awakeFromNib {
// 修复IOS7中的BUG- 初始化 constraints warning self.contentView.bounds = [UIScreen mainScreen].bounds;
} //关联控件进行数据显示
-(void)setEntity:(LDEntity *)entity{
_entity = entity; self.titleLabel.text = entity.title;
self.contentLabel.text = entity.content;
self.contentImageView.image = entity.imageName.length > 0 ? [UIImage imageNamed:entity.imageName] : nil;
self.usernameLabel.text = entity.username;
self.timeLabel.text = entity.time;
} #if 0 // 假设没有使用 auto layout, 请重写这种方法
- (CGSize)sizeThatFits:(CGSize)size
{
CGFloat totalHeight = 0;
totalHeight += [self.titleLabel sizeThatFits:size].height;
totalHeight += [self.contentLabel sizeThatFits:size].height;
totalHeight += [self.contentImageView sizeThatFits:size].height;
totalHeight += [self.usernameLabel sizeThatFits:size].height;
totalHeight += 40; // margins
return CGSizeMake(size.width, totalHeight);
} #endif @end

開始编写我们最重要的类LDViewController.在编写这个类之前。我们须要使用FDTemplateLayout

,而且将TableViewController与LDViewController进行关联

LDViewController.h

#import <UIKit/UIKit.h>

@interface FDFeedViewController : UITableViewController

@end

TableView的使用有不明确的能够去学习下,这里不做解释了。凝视中给出了重点的地方解说,设置data source以及设置Delegate在程序中做出区分

LDViewController.m


#import "LDViewController.h"
#import "UITableView+FDTemplateLayoutCell.h"
#import "LDEntity.h"
#import "LDCell.h" @interface LDViewController ()<UIActionSheetDelegate> @property (nonatomic, copy) NSArray *prototypeEntitiesFromJSON;
@property (nonatomic, strong) NSMutableArray *feedEntitySections; // 2d array
@property (nonatomic, assign) BOOL cellHeightCacheEnabled; @end @implementation LDViewController - (void)viewDidLoad {
[super viewDidLoad]; self.tableView.estimatedRowHeight = 200;
self.tableView.fd_debugLogEnabled = YES; self.cellHeightCacheEnabled = YES; [self buildTestDataThen:^{
self.feedEntitySections = @[].mutableCopy;
[self.feedEntitySections addObject:self.prototypeEntitiesFromJSON.mutableCopy];
[self.tableView reloadData];
}];
} - (void)buildTestDataThen:(void (^)(void))then
{
// 模拟一个异步请求
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 读取数据从 `data.json`
NSString *dataFilePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:dataFilePath];
NSDictionary *rootDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSArray *feedDicts = rootDict[@"feed"]; // 讲数据转化为 `LDEntity`
NSMutableArray *entities = @[].mutableCopy;
[feedDicts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[entities addObject:[[LDEntity alloc] initWithDictionary:obj]];
}];
self.prototypeEntitiesFromJSON = entities; // 重返
dispatch_async(dispatch_get_main_queue(), ^{
!then ?: then();
});
});
} //设置数据源
#pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return self.feedEntitySections.count;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.feedEntitySections[section] count];
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//LDCell为Main.storyboard中的cell控件
LDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"LDCell" forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
} - (void)configureCell:(LDCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
cell.fd_enforceFrameLayout = NO; // Enable to use "-sizeThatFits:"
if (indexPath.row % 2 == 0) {
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
} else {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
cell.entity = self.feedEntitySections[indexPath.section][indexPath.row];
} //设置托付
#pragma mark - UITableViewDelegate - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.cellHeightCacheEnabled) { //LDCell为Main.storyboard中的cell控件 return [tableView fd_heightForCellWithIdentifier:@"LDCell" cacheByIndexPath:indexPath configuration:^(LDCell *cell) {
[self configureCell:cell atIndexPath:indexPath];
}];
} else {
return [tableView fd_heightForCellWithIdentifier:@"LDCell" configuration:^(LDCell *cell) {
[self configureCell:cell atIndexPath:indexPath];
}];
}
} - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSMutableArray *mutableEntities = self.feedEntitySections[indexPath.section];
[mutableEntities removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
} @end

假设你想有自己的cell,你能够这么做:


#import "UITableView+FDTemplateLayoutCell.h" - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [tableView fd_heightForCellWithIdentifier:@"reuse identifer" configuration:^(id cell) {
// 配置此Cell(单元格)的数据, 同你在"-tableView:cellForRowAtIndexPath:"做了什么一样
// 像这样:
// cell.entity = self.feedEntities[indexPath.row];
}];
}

以下制作我们的最后一个功能就是下拉刷新操作

我们使用UITableViewController自带的UIRefreshControl

在LDViewController.m中加入此方法,而且与UIRefreshControl关联

//又一次载入数据

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.feedEntitySections removeAllObjects];
[self.feedEntitySections addObject:self.prototypeEntitiesFromJSON.mutableCopy];
[self.tableView reloadData];
[sender endRefreshing];
});

效果例如以下:

使用FDTemplateLayout框架打造个性App的更多相关文章

  1. 从0到1打造直播 App

    转自http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 概要 分享内容: 互联网内容载体变迁历程,文字——图片/声音——视频——VR/AR——……..从直 ...

  2. 【腾讯Bugly干货分享】从0到1打造直播 App

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d42e7fd6ec467453bf58 作者:李智文 概要 分享内容: ...

  3. 从0到1打造直播 App(直播流程介绍整理 <mark><转>)

    注明:原创 2016-10-27 李智文 腾讯Bugly 概要 分享内容: 互联网内容载体变迁历程,文字——图片/声音——视频——VR/AR——……..从直播1.0秀场时代(YY),2.0游戏直播(斗 ...

  4. iOS利用HealthKit框架从健康app中获取步数信息

    微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为 ...

  5. MakePic.com 图片制造 打造个性签名 拒绝垃圾邮件 生成个性印章

    MakePic.com 图片制造 打造个性签名 拒绝垃圾邮件 生成个性印章 欢迎使用MakePic.com

  6. 利用 Dijit 组件框架打造丰富的用户界面

    原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...

  7. 使用appium框架测试安卓app时,获取toast弹框文字时,前一步千万不要加time.sleep等等待时间。

    使用appium框架测试安卓app时,如果需要获取toast弹框的文案内容,那么再点击弹框按钮之前,一定记得千万不要加time.sleep()等待时间,否则有延迟,一直获取不到: 获取弹框的代码: m ...

  8. android动画源码合集、动态主题框架、社交app源码等

    Android精选源码 仿MIUI果冻视图-BouncingJellyView   一个快速易用的动态主题框架   android动画效果集合源码   android使用Kotlin开发的Dribbb ...

  9. 1.用互联网的产品思维打造一本app后端的书

    刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从 ...

随机推荐

  1. java.net.BindException: Permission denied

    端口号报错: 解决办法:把端口号改为1000以上的,比如8080

  2. 洛谷P1822 魔法指纹 【分块打表】

    题目 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为magic(n).若n为一位数, ...

  3. Docker学习之Docker Registry

    前言 前面已经学习了怎样通过Dockerfile来构建我们自己的镜像了,但是一个系统可能包含着很多个微服务即有很多个镜像,当镜像越来越多的时候,就必须得有一个地方来管理这些镜像,Docker官方提供了 ...

  4. 沼泽鳄鱼(bzoj 1898)

    Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几 ...

  5. 球形空间产生器sphere(bzoj 1013)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...

  6. .NET返回上一页

    原文发布时间为:2010-05-25 -- 来源于本人的百度文章 [由搬家工具导入] if (Request.UrlReferrer != null)                {         ...

  7. ckeditor编辑的使用方法

    一.下载安装Ckeditor,并将其整合到项目中 1.什么是CKeditor?为什么要使用它? 我们在做门户网站或者公文系统时,客户经常要求在录入时能够更改字体样式.大小.颜色并具备插入图片的功能.而 ...

  8. java网络编程学习笔记(四):线程池的实现

    package QQ; import java.util.LinkedList; /** * Created by hu on 2015/11/9. */ public class ThreadPoo ...

  9. Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分

    题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...

  10. ScrollView嵌套ViewPager,ViewPager内容不显示问题

    在ViewPager外面嵌套ScrollView时导致ViewPager 中内容不显示,解决的办法是在ScrollView标签下加入:android:fillViewport="true&q ...