iOS使用代码直接自定义cell 并添加button响应

原创 2016年08月29日 14:53:59


//iOS 使用代码自定义cell 并添加button响应


由于使用xib画cell界面虽然说是相对比较快,但是代码管理很不方便,使用git等工具无法进行共享对比。因此,很多时候需要自己写代码来创建xib界面,并引用到tableView中去。

例如,我写的是一个里面含有一个image和一个textFiled的cell。


1、先创建一个TableViewCell类,自定义,继承于UITableViewCell

其代码入下所示:

在TableViewCell.h中:

@interface TableViewCell : UITableViewCell
@property (nonatomic,strong) UIButton *iconBtn;
@property (nonatomic,strong) UITextField *firstText;
@end

在TableViewCell.m中

#import "TableViewCell.h"

#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define ICON_IMAGE 20
#define MINCRAK 15

//textfiled框离左边的宽度
#define FIRSTTEXT_Left 60
#define FIRSTTEXT_HIGH 38

@implementation TableViewCell


//初始化Cell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    
    self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
    if(self){
        [self initCell];
        [self setSubviewFramWithCellHeight:50 iconWidHei:ICON_IMAGE firtextWid:SCREEN_WIDTH/8*3 firtexHei:FIRSTTEXT_HIGH];

    }
    return self;
}


-(void)initCell{
    
    //1、创建头像
    _iconBtn=[[UIButton alloc]init];
    [_iconBtn setBackgroundImage:[UIImage imageNamed:@"contact.jpg"] forState:UIControlStateNormal];
    [self.contentView addSubview:_iconBtn];
       
    //2、创建textfield
    _firstText=[[UITextField alloc] init];
    _firstText.text=@"请输入数据";
    _firstText.textColor=[UIColor grayColor];
    _firstText.borderStyle=UITextBorderStyleBezel;
    _firstText.clearsOnInsertion=YES;
    _firstText.allowsEditingTextAttributes=YES;
    _firstText.delegate=self;
    [self.contentView addSubview:_firstText];
}


//参数说明:cell高度、头像宽高、第一个text长度、第一个text高度
-(void)setSubviewFramWithCellHeight:(CGFloat )cellheight iconWidHei:(CGFloat )iconWH firtextWid:(CGFloat )firtexW firtexHei:(CGFloat )firtexH{
    
    //头像
    _iconBtn.frame=CGRectMake((SCREEN_WIDTH/4-iconWH)/2-MINCRAK, (cellheight-iconWH)/2, iconWH, iconWH);
    
    //textfiled
    CGFloat firtexX=FIRSTTEXT_Left;
    _firstText.frame=CGRectMake(firtexX, (cellheight-firtexH)/2, firtexW, firtexH);

@end


2、写好了TableViewCell后,则可在TableViewController中引用。

TableViewController.h:

#import <UIKit/UIKit.h>

@interface TableViewController : UITableViewController

@end


TableViewController.m:

#import "TableViewController.h"
#import "TableViewCell.h"


//TableView中的每个Cell的高度
#define CELLL_ROWHIEGH 55

//TableView距离屏幕上面的距离
#define TABLE_HIGH 70
//屏幕宽度
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

//TableView标题的高度
#define TABLEHEAD_HIGH 50

@interface TableViewController (){

    //存储信息
    NSMutableArray * contactData;
    //行数
 int rowInSectionZero;
}

@property (nonatomic,strong)UILabel *lable1;
@end

@implementation TableViewController

- (void)viewDidLoad {
    
    //设置tableView的每行行高度
    self.tableView.rowHeight=CELLL_ROWHIEGH;
    
    
    //第一次加载,设置第一个section的row值为1
    rowInSectionZero=1;
    
    //最后数据存入contactData中
    contactData=[[NSMutableArray alloc] init];
    
    //设置tableView头距离屏幕上方距离
    self.tableView.contentInset=UIEdgeInsetsMake(TABLE_HIGH, 0, 0, 0);
    self.tableView.scrollIndicatorInsets=UIEdgeInsetsMake(TABLE_HIGH, 0, 0, 0);
    
    //初始化tableView标题,并设置标题高度及内容
    [self createTableViewHeaderWithstartX:0 startY:0 tableViewHeadWidth:SCREEN_WIDTH tableViewHeadHeigh:TABLE_HIGH];
    
    //设置tableView分割线格式
    self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
        
    [super viewDidLoad];
}

//创建tableView的头:Lable,完成  (给TableView的头上面添加一个Label 一个button)
-(void)createTableViewHeaderWithstartX:(CGFloat )x startY:(CGFloat )y tableViewHeadWidth:(CGFloat)length tableViewHeadHeigh:(CGFloat)width{
    UIView *headerView = [[UIView alloc] initWithFrame: CGRectMake(x, y, length, width)];
    self.tableView.tableHeaderView = headerView;
    self.tableView.tableHeaderView.backgroundColor=[UIColor whiteColor];
    UILabel *lableHead=[[UILabel alloc] initWithFrame:CGRectMake((SCREEN_WIDTH-100)/2, (TABLE_HIGH-40)/2, 100, 40)];
    lableHead.font =[UIFont systemFontOfSize:19];
    lableHead.text=@"TableViewHead";
    [self.tableView.tableHeaderView addSubview:lableHead];
    UIButton *btnAdd=[[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-80, (TABLE_HIGH-40)/2, 70, 40)];
    [btnAdd setTitle:@"完成" forState:UIControlStateNormal];
    [btnAdd setFont:[UIFont systemFontOfSize:21]];
    [btnAdd setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [btnAdd setTintColor:[UIColor redColor]];
    [self.tableView.tableHeaderView addSubview:btnAdd];
    
}
//一下两个为重要函数,显示出TableView有几组和几行
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//#warning Incomplete implementation, return the number of sections
    
    return 2;
    
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//#warning Incomplete implementation, return the number of rows
    if(section==0){
        return rowInSectionZero;
    }else{
        return 1;
    }
    
}

//最简单的方式,不对每个CEll进行标记,内存优化
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        TableViewCell *cell=[[TableViewCell alloc]init];
        cell.selectionStyle=UITableViewCellSelectionStyleNone;
        cell.delegate = self;
        if(indexPath.row!=0){
            [cell.iconBtn setBackgroundImage:[UIImage imageNamed:@"delete.jpg"] forState:UIControlStateNormal];
        }
        return cell;
}


由此,则可以在TableView中显示出自己代码写的TableViewCell了,因为上函数中的TAbleViewCell是自定义的,因此和自己写的类相关联,由此最简单的界面就完成了。


3、深入研究  =================如何在自己代码写的Cell中添加button,点击能够得到该Section该row的值。

此时,比如在前面的image由于我刚开始定义的就是button,

3.1、在TableViewCell.h中先声明协议:

@protocol myTabVdelegate <NSObject>
-(void)removeContactVClick:(UITableViewCell*)cell;
@end

再声明代理:

//声明代理
@property(assign,nonatomic)id<myTabVdelegate>delegate;

@end


3.2、在TableViewCell.m的iconBtn定义的时候,加上:

  

  [_iconBtnaddTarget:selfaction:@selector(removeContact:)forControlEvents:UIControlEventTouchUpInside];

由此,在后面自定义函数:

-(void)removeContact:(UIButton *)sender
{
    [self.delegateremoveContactVClick:self];
    
}


3.3、在TableViewController中,添加代理:

@interface TableViewController ()<myTabVdelegate>


3.4、即可在后面添加相应函数:

//点击前面的图片时
-(void)removeContactVClick:(UITableViewCell*)cell{
    NSIndexPath *index = [self.tableView indexPathForCell:cell];
    NSLog(@"index.row=%ld,index.section=%ld",(long)index.row,(long)index.section);
    if(index.row==0&&index.section==0){
        //如果是第一个,不动,如果不是第一个,则要将该行删除
        NSLog(@"row=0,section=0");
    }else{
        rowInSectionZero--;
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:index] withRowAnimation:YES];
        
    }

}}


由此,可对TableView的每个Cell添加button,并保证button能够相应。


4、还可以对textfield添加响应,从而使得点击textfield的时候,键盘能够弹出,但此时3.2的步骤中的ControlEvents就变成UIControlEventEditingDidBegin即可。



















自定义Cell中按钮的点击事件

在实际开发工作中,我们经常会在自定义的Cell中布局一些按钮,并且很多时候我们会在点击这个按钮的时候使我们的UItableviewController跳转到下一界面,有的可能还要传值。那么如何使我们的...
  • JourneyYoung
  • JourneyYoung
  • 2016年07月11日 11:05
  • 4658

iOS 自定义UITableViewCell上添加UIButton按钮如何确定点击了哪一行,代码块实现

用代码块的方式实现自定义cell上添加UIButton按钮,并实现点击了哪一行。 1、在自定义cell的.h文件中声明一个代码属性。 2.在cell上添加一个UIButton按钮.在...
  • st646889325
  • st646889325
  • 2016年11月02日 09:07
  • 1023

ios tableView 自定义cell上的按钮点击事件不好用

ios tableView 自定义cell上的按钮点击事件不好用,ios 7 之后在cell中添加的按钮,实际上是添加在cell的scrollView...
  • xiaonadiandian
  • xiaonadiandian
  • 2015年08月27日 13:45
  • 1992

自定义UITableViewCell 上的多个按钮点击事件处理

m 今天突然做项目的时候,又遇到处理自定义的UITableViewCell上按钮的点击事件问题。我知道有两种方式,可是突然想不起来之前是怎么做的了,好记性不如烂笔头,还是记录一下吧。 1、第一种方...
  • m372897500
  • m372897500
  • 2015年04月17日 16:49
  • 39061

iOS 8自定义cell的删除按钮

**  *  tableView:editActionsForRowAtIndexPath:     //设置滑动删除时显示多个按钮  *  UITableViewRowAction   ...
  • JsoneyLz
  • JsoneyLz
  • 2015年05月16日 17:28
  • 815

iOS纯代码自定义UITableViewCell及性能优化

知识准备      自定义Cell的实现方式         1. 纯代码方式:纯代码又可以通过frame和autolayout技术来实现         2.XIB方式         3.Stor...
  • vbirdbest
  • vbirdbest
  • 2016年08月25日 14:15
  • 2605

iOS 自定义Cell按钮的点击代理事件

在实际开发工作中,我们经常会在自定义的Cell中布局一些按钮,并且很多时候我们会在点击这个按钮的时候使我们的UItableviewController跳转到下一界面,有的可能还要传值。那么如何使我们的...
  • yusirxiaer
  • yusirxiaer
  • 2016年11月16日 15:13
  • 2648

UITableViewCell中自定义cell上UILabel添加手势没有响应解决方案

情况一:自定义UITableViewCell,且cell中添加了一个UILabel,我们的目的是给该label添加一个手势。 情况二:原生cell上添加了一个UIView,我们的目的是给UIView上...
  • ZhangYanJinLiChang
  • ZhangYanJinLiChang
  • 2015年07月28日 16:52
  • 3954

[iOS tableViewCell 复用] xib自定义cell 修改cell中按钮状态 出现按钮状态被复用

最近脑子秀逗了 最近开始手写购物车,在自定义tableviewcell之后,在自定义的cell中添加一个可以选中的按钮,啥也没想就去register 然后设置代理,在vc中去修改按钮状态 btn....
  • iOSTianNan
  • iOSTianNan
  • 2016年12月13日 16:27
  • 1630

IOS菜鸟的所感所思(四)——自定义UICollectionViewCell以及网络数据的添加。

自定义UICollectionViewCell实现自定义UICollectionViewCell,然后再向里添加网络获取的数据。...
  • MyCodeDancer
  • MyCodeDancer
  • 2015年05月24日 13:17
  • 1601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS使用代码直接自定义cell 并添加button响应
举报原因:
原因补充:

(最多只允许输入30个字)