初次试水自定义cell的UITableView

          实现目标                            

          

           最终实现结果

           

  界面复原度:98%

  未能完全复刻的地方:下半部分的tableview与头部的控件间距上的误差

  原因:在做tableview时继承了tableViewController,使下半部分无法使用masnory进行位置调整。

  导师建议:在整个页面内容是由tableView布局时可以选择UITableViewController作为页面的主控制器,而且由于Xcode给出的UITableViewControlller控制器布局存在局限性。在公司的操作中一般有自己定义的TableViewController控制器,以便应对不同的项目的界面设计需求。

  由于本次页面练习的目的为熟悉用自定义的cell实现tableView,故并没有再修改tableView的位置。而且我认为把这样的错误留着,可以作为日后做页面时提醒自己对控制器的选择。所以接下来言归正传,回到自定cell的建立以及在tableView的使用。

1、自定义cell的设置

  最基本的就是创建一个继承UITableViewCell类的Cocoa Touch Class,自己取个名字(因为懒所以就直接取名为默认文件名TableViewCell,这样的命名习惯在项目实践操作中不好,但由于是自己练手的project,包含的文件不多,所以没有多大关系)。真正开始定义cell前,预备工作:把Masnory包加进project(控件布局)并用头文件引入。这回真的要开始画cell咯!

  从cell的截图可以看出我们所需要的控件类型以及数目,故我们需要声明相应的对象。控件声明有三种途径:一、在“TableViewCell.h”头文件里的interface下大括号内直接声明 二、用property声明成员变量,格式 @property (attributes) type propertyName;  三、在。两种方法的区别第一种是封装在类内的对象(默认为protected权限),如若需要获取或更改,则需要在类内自定义setter、getter方法,第二种则自动生成以上两种方法。第三种则是在“TableViewCell.m”里声明的对象,默认为private权限。

  界面实现时暂时用静态数据来代替数据源,在实现界面的具体功能时静态数据对象可以用数据对象来代替。(这里就不过多介绍了)

 #import <UIKit/UIKit.h>

 @interface TableViewCell : UITableViewCell

 @property (nonatomic,strong) UILabel *name; // 商品名称
@property (nonatomic,strong) UILabel *share; // 份额
@property (nonatomic,strong) UILabel *price; //转让价格
@property (nonatomic,strong) UILabel *interest ; // 收益
@property (nonatomic,strong) UILabel *price1;//投资本金
@property (nonatomic,strong) UILabel *yzrstatus;// 已转让状态
@property (nonatomic,strong) UILabel *redstatus;// 回款结束状态
@property (nonatomic,strong) UILabel *unit0;// 元/份
@property (nonatomic,strong) UILabel *unit1;// 元 //静态数据
@property (nonatomic,strong) UILabel *enddate; // 到期日
@property (nonatomic,strong) UILabel *principal; // 本金
@property (nonatomic,strong) UILabel *transferAmount; // 价格
@property (nonatomic,strong) UILabel *inprincipal; // 收益数
@property (nonatomic,strong) UILabel *transhare; // 份额数 -(void)refresh;
@end

  我们能看到的两个cell虽然大致的布局相同,可显示的内容上还是有部分差别,所以在这个时候就需要用到refresh的方法,对不同数据源的cell内容进行改变。

  定义完控件对象就要给这些控件找好位置,这时候之前的准备工作Masnory类就非常重要了,是当前项目实践布局中最广泛使用的方法类。理论上和bootstrap搭建相似,用绝对位置和相对位置来控制对象在页面中的位置。首先对cell进行初始化,但不建议把所有自定代码都堆在初始化中,我用setup方法类对控件对象进行了简陋的封装,具体实现参考文末的源代码。这里只展示简单的refresh方法。

 -(void)refresh{
_share.hidden=YES;
_interest.hidden=NO;
_price.hidden=YES;
_price1.hidden=NO;
_transferAmount.hidden=YES;
_inprincipal.hidden=NO;
_transhare.hidden=YES;
_principal.hidden=NO;
_unit0.hidden=YES;
_unit1.hidden=NO; //状态转化可以用if语句进行条件判断,选择状态类型
_yzrstatus.hidden=YES;
_redstatus.hidden=NO; }

2、tableView的使用

  首先普及一些基本知识,tableView分两种基本类型UITableViewStylePlain和UITableViewStyleGrouped。section是一个组,row是单元格的行号。tableView的控制方法在本实践中我并没有全部列出,但TableView学习中则必须全部掌握,因为在项目操作中TableViewController是个非常重要的控制器,我在本次项目中加的方法如下。

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

     return ;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return ;
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone; //设置表格点击之后没有渐变的效果
if (tableView == self.tableView)
{
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID=@"cell";
TableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
if(!cell){
cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
} if(indexPath.row==){
[cell refresh];
}
return cell;
} - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return ;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

  本次菜鸟实践我讲的差不多了,省略了很多细节,但大抵把要注意的也讲完了。希望这个博客能给自己提点醒吧,还有很多东西要去琢磨、学习。如果想看源代码,请点这里。

  参考链接:tableView的设定

         iOS学习之UITableView

UITableView(自定义cell)试水心得的更多相关文章

  1. UITableView自定义Cell中,纯代码编程动态获取高度

    在UITableView获取高度的代理方法中,经常需要根据实际的模型重新计算每个Cell的高度.直接的做法是在该代理方法中,直接根据模型来返回行高:另 [1]-(CGFloat)tableView:( ...

  2. iOS开发-UITableView自定义Cell

    UITableView在iOS中开发的重要地位是毋庸置疑的,基本上应用中用到的比例是一半左右,而且大部分情况都是需要自定义单元格的,这样用户看到的App才能更有美感.之前写过UITableView的基 ...

  3. iOS开发总结-UITableView 自定义cell和动态计算cell的高度

    UITableView cell自定义头文件:shopCell.h#import <UIKit/UIKit.h>@interface shopCell : UITableViewCell@ ...

  4. [iOS]技巧集锦:UITableView自定义Cell中的控件无法完全对齐Cell的左边界和右边界

    这是个很诡异的问题,由于一些特殊需求,我的TableView的Cell的背景色是透明,其中的控件会有背景色,第一个控件和最后一个控件我都用IB自动设了约束,对齐Cell的左边界和右边界,但是自动约束很 ...

  5. 微信小程序自定义数据分析试水

    昨晚收到小程序自定义分析的内测邀请,简单试用了一下.说明挺长的,大概是这个意思: 一.定义一系列事件,对其进行统计 事件可以对页面中的这些事件进行追踪 click enterPage leavePag ...

  6. iOS深入学习(UITableView系列4:使用xib自定义cell)

    可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  7. UI学习笔记---第十一天UITableView表视图高级-自定义cell

    自定义cell,多类型cell混合使用,cell自适应高度 自定义cell就是创建一个UITableViewCell的子类 把cell上的空间创建都封装在子类中,简化viewController中的代 ...

  8. IOS开发中UITableView(表视图)的滚动优化及自定义Cell

    IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...

  9. iOS开发之自定义UITableView的cell

    系统默认的UITableViewCell的每行都有横线(分隔符),就算没有数据也是如此,有时候我们想只在有数据的地方有下划线,可以去除下划线,然后在awarkFromNid方法中使用addsubvie ...

随机推荐

  1. 【还是回来了】博客搬家--https://cangbean.github.io

    还是弄了个自己的地址:https://cangbean.github.io 想记录下,防止万一以后迁移不好弄 想练习markdown写作 折腾而已 以后不再博客园记录东西了,但是还是会回来看看的

  2. 学习创建spring boot

    一.什么是spring boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开 ...

  3. mysql索引的选择

    一:索引的常见模型 1.哈希表(key-value)存储的数据结构 缺点:hash索引在做区间查询时,速度慢. 优点:hash索引很适用于等值查询的场景,比如memcached以及其他一些nosql引 ...

  4. Spring Boot:如何优雅的使用 Mybatis

    mybatis-spring-boot-starter 官方说明:MyBatis Spring-Boot-Starter will help you use MyBatis with Spring B ...

  5. wholesale custom weighted blankets / travel weighted blankets

    What is weighted blankets? Weighted blanket named heavy gravity blanket,for child and adult. Help re ...

  6. 《程序设计入门——C语言》翁恺老师 第四周编程练习记录

    1 奇偶个数(5分) 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据.程序输出读到的数据中的奇数和偶数的个数. 输入格式: 一系列正整数,整数的范围是(0,1 ...

  7. 程序员必会算法-KMP算法

    KMP算法是一种优秀的字符串匹配算法,字符串匹配的常规算法是一步一步进行移位和比较操作,直至找到完全相匹配的字符串. 下面通过一个例子,为大家仔细说明KMP算法的使用和思路: 问题: 在字符串“DEA ...

  8. 虚拟机网络NAT模式配置静态IP

    虚拟机网络连接方式 安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口. 虚拟机常见有三种网络连接方式 ...

  9. Python——字符串、文件操作,英文词频统计预处理

    一.字符串操作: 解析身份证号:生日.性别.出生地等. 凯撒密码编码与解码 网址观察与批量生成 2.凯撒密码编码与解码 凯撒加密法的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左 ...

  10. JSP学习(2)---四种基本语法与三种编译指令

    JSP的异常可以不处理,即使是checked异常. 四种基本语法: jsp声明,jsp注释,jsp表达式,jsp脚本 三种编译指令: page,include,taglib 下面是具体的练习. sho ...