iOS_14_tableViewController_xib创建和封装自定义cell

最终效果图:

xib+自定义cell的封装标准步骤:(按此步骤者,事半功倍)

xib+自定义cell的封装标准步骤:(按此步骤者,事半功倍)
 1,新建GirlCell.xib,往里面拖一个tableViewCell,在cell中拖入各种控件
 2,新建GirlCell类,继承自uitableViewCell
 3,将GirlCell.xib界面中cell的类名更改成GirlCell,并且指定重用的identifer,一般写类名
 4,将GirlCell.xib界面中所有的各种控件,连线到类GirlCell中,使它们都成为GirlCell类的成员
 5,新建数据模型 Girl,方法列表如下

        // UI控件用weak,字符串用copy,其他对象用strong
        // 头像图片名
        @property(nonatomic,copy)NSString *headImgName;
        // 姓名
        @property(nonatomic,copy)NSString *name;
        // 判词
        @property(nonatomic,copy)NSString *verdict;

        // 类方法,字典 转 对象 类似javaBean一次性填充
        + (Girl *)girlWithDict:(NSDictionary *)dict;

        // 对象方法,设置对象的属性后,返回对象
        - (Girl *)initWithDict:(NSDictionary *)dict;

 6,封装的GirlCell,方法列表如下

         @property (weak, nonatomic) IBOutlet UIImageView *headImg;
         @property (weak, nonatomic) IBOutlet UILabel *name;
         @property (weak, nonatomic) IBOutlet UILabel *verdict;

         // 返回xib界面中cell的高度
         + (CGFloat)cellHeight;

         // 返回xib界面上写的重用cellID
         + (NSString *)cellID;

         // 从xib中加载 实例化一个girlCell对象
         + (GirlCell *)girlCell;

         // 参数是数据模型girl对象,填充值到xib中各个控件 ,并返回封装好数据之后的,girlCell对象
         - (GirlCell *)cellWithGirl:(Girl *)girl;

 7,控制器中 cellForRow方法如下
     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     {
         // 把cell封装之后,控制 器知道的东西就非常少了~

         // 先从缓存池中,根据ID取出自已的cell类
         GirlCell *girlCell = [tableView dequeueReusableCellWithIdentifier:[GirlCell cellID]];
         if (girlCell == nil) {
         // 如果池中没取到,则类方法,重新生成一个崭新的girlCell,xib界面中指定了重用cellID
         girlCell = [GirlCell girlCell];
         }
         // 设置cell中独一无二的内容
         Girl *girl = [_girls objectAtIndex:indexPath.row];
         // 参数为girl对象,填充其各个成员值到xib中各个控件 ,并返回填充好的cell
         girlCell = [girlCell cellWithGirl:girl];
         // 返回cell
         return girlCell;

     }

创建tableViewController的标准步骤:

创建tableViewController的标准步骤:
 1,新建工程,然后,删除viewController.h和.m文件
 2,new File 选择OC 类,继承自UITableViewController
 3,到main.storyboard中删除 默认的viewController
 4,拖动一个黄色的tableViewController到main.storyboard,并更改file's owner为自已经建立的BeyondTableViewController
 5,仍然到main.storyboard中删除 自动生成的cell控件
 6,运行既可

Girl.h


//
//  Girl.h
//  12_tableView的增删改
//
//  Created by beyond on 14-7-27.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Girl : NSObject
// UI控件用weak,字符串用copy,其他对象用strong
// 头像图片名
@property(nonatomic,copy)NSString *headImgName;
// 姓名
@property(nonatomic,copy)NSString *name;
// 判词
@property(nonatomic,copy)NSString *verdict;

// 类方法,字典 转 对象 类似javaBean一次性填充
+ (Girl *)girlWithDict:(NSDictionary *)dict;

// 对象方法,设置对象的属性后,返回对象
- (Girl *)initWithDict:(NSDictionary *)dict;
@end

Girl.m


//
//  Girl.m
//  12_tableView的增删改
//
//  Created by beyond on 14-7-27.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "Girl.h"

@implementation Girl

// 类方法,字典 转 对象 类似javaBean一次性填充
+ (Girl *)girlWithDict:(NSDictionary *)dict
{
    // 只是调用对象的initWithDict方法,之所以用self是为了对子类进行兼容
    return [[self alloc]initWithDict:dict];
}

// 对象方法,设置对象的属性后,返回对象
- (Girl *)initWithDict:(NSDictionary *)dict
{
    // 必须先调用父类NSObject的init方法
    if (self = [super init]) {
        // 设置对象自己的属性
        self.name = dict[@"name"]   ;
        self.headImgName = dict[@"headImg"] ;
        self.verdict = dict[@"verdict"];
    }
    // 返回填充好的对象
    return self;
}
@end

GirlCell.xib

GirlCell.h


//
//  GirlCell.h
//  14_tableViewController_xib自定义cell
//
//  Created by beyond on 14-7-28.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
/*
 xib+自定义cell的封装标准步骤:(按此步骤者,事半功倍)
 1,新建GirlCell.xib,往里面拖一个tableViewCell,在cell中拖入各种控件
 2,新建GirlCell类,继承自uitableViewCell
 3,将GirlCell.xib界面中cell的类名更改成GirlCell,并且指定重用的identifer,一般写类名
 4,将GirlCell.xib界面中所有的各种控件,连线到类GirlCell中,使它们都成为GirlCell类的成员
 5,新建数据模型 Girl,方法列表如下

        // UI控件用weak,字符串用copy,其他对象用strong
        // 头像图片名
        @property(nonatomic,copy)NSString *headImgName;
        // 姓名
        @property(nonatomic,copy)NSString *name;
        // 判词
        @property(nonatomic,copy)NSString *verdict;

        // 类方法,字典 转 对象 类似javaBean一次性填充
        + (Girl *)girlWithDict:(NSDictionary *)dict;

        // 对象方法,设置对象的属性后,返回对象
        - (Girl *)initWithDict:(NSDictionary *)dict;

 6,封装的GirlCell,方法列表如下

         @property (weak, nonatomic) IBOutlet UIImageView *headImg;
         @property (weak, nonatomic) IBOutlet UILabel *name;
         @property (weak, nonatomic) IBOutlet UILabel *verdict;

         // 返回xib界面中cell的高度
         + (CGFloat)cellHeight;

         // 返回xib界面上写的重用cellID
         + (NSString *)cellID;

         // 从xib中加载 实例化一个girlCell对象
         + (GirlCell *)girlCell;

         // 参数是数据模型girl对象,填充值到xib中各个控件 ,并返回封装好数据之后的,girlCell对象
         - (GirlCell *)cellWithGirl:(Girl *)girl;

 7,控制器中 cellForRow方法如下
     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     {
         // 把cell封装之后,控制 器知道的东西就非常少了~

         // 先从缓存池中,根据ID取出自已的cell类
         GirlCell *girlCell = [tableView dequeueReusableCellWithIdentifier:[GirlCell cellID]];
         if (girlCell == nil) {
         // 如果池中没取到,则类方法,重新生成一个崭新的girlCell,xib界面中指定了重用cellID
         girlCell = [GirlCell girlCell];
         }
         // 设置cell中独一无二的内容
         Girl *girl = [_girls objectAtIndex:indexPath.row];
         // 参数为girl对象,填充其各个成员值到xib中各个控件 ,并返回填充好的cell
         girlCell = [girlCell cellWithGirl:girl];
         // 返回cell
         return girlCell;

     }

 */

#import <UIKit/UIKit.h>
@class Girl;
@interface GirlCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UIImageView *headImg;
@property (weak, nonatomic) IBOutlet UILabel *name;
@property (weak, nonatomic) IBOutlet UILabel *verdict;

// 返回xib界面中cell的高度
+ (CGFloat)cellHeight;

// 返回xib界面上写的重用cellID
+ (NSString *)cellID;

// 从xib中加载 实例化一个girlCell对象
+ (GirlCell *)girlCell;

// 参数是数据模型girl对象,填充值到xib中各个控件 ,并返回封装好数据之后的,girlCell对象
- (GirlCell *)cellWithGirl:(Girl *)girl;
@end

GirlCell.m


//
//  GirlCell.m
//  14_tableViewController_xib自定义cell
//
//  Created by beyond on 14-7-28.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "GirlCell.h"
#import "Girl.h"
@implementation GirlCell
// 返回xib界面中cell的高度
+ (CGFloat)cellHeight
{
    // 查看一下xib中cell的高度
    return 80;
}
// 返回xib界面上写的重用cellID
+(NSString *)cellID
{
    // 必须和界面上的一致
    return @"GirlCell";
}

// 从xib中加载 实例化一个girlCell对象
+ (GirlCell *)girlCell
{
    // mainBundel加载xib,扩展名不用写.xib
    NSArray *arrayXibObjects = [[NSBundle mainBundle] loadNibNamed:@"GirlCell" owner:nil options:nil];
    return arrayXibObjects[0];
}
// 返回封装好数据之后的,girlCell对象
- (GirlCell *)cellWithGirl:(Girl *)girl
{
    // 前面,通过连线,将xib中的各个控件,连接到GirlCell类,成为它的成员属性了,这样一来就不用通过tag取得xib中每一个控件了
    _name.text = girl.name;
    _headImg.image = [UIImage imageNamed:girl.headImgName];
    _verdict.text = girl.verdict;
    // 返回封装好数据之后的,girlCell对象
    return self;
}
@end

main.storyboard

BeyondTableViewController.h

//
//  BeyondTableViewController.h
//  14_tableViewController_xib自定义cell
//
//  Created by beyond on 14-7-28.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <UIKit/UIKit.h>

// tableViewController 继承自UIViewController且已经遵守了数据源和代理,其内部的view就是tableView,且已经自己连线了数据源和代理
/*
 创建tableViewController的标准步骤
 1,新建工程,然后,删除viewController.h和.m文件
 2,new File 选择OC 类,继承自UITableViewController
 3,到main.storyboard中删除 默认的viewController
 4,拖动一个黄色的tableViewController到main.storyboard,并更改file's owner为自已经建立的BeyondTableViewController
 5,仍然到main.storyboard中删除 自动生成的cell控件
 6,运行既可
 */
@interface BeyondTableViewController : UITableViewController

@end

BeyondTableViewController.m


//
//  BeyondTableViewController.m
//  14_tableViewController_xib自定义cell
//
//  Created by beyond on 14-7-28.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondTableViewController.h"
#import "Girl.h"
#import "GirlCell.h"

@interface BeyondTableViewController ()
{
    // 从plist文件中加载的所有girls,返回所有的对象组成的数组
    NSMutableArray *_girls;
}
@end

@implementation BeyondTableViewController

// 隐藏顶部的状态栏
- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 初始化 对象数组
    _girls = [NSMutableArray array];

    // plist转成对象数组
    [self plistToObjects];

}
// plist转成对象数组
- (void)plistToObjects
{
    // sg_bundle模板代码,1,获得.app主要的包;2,返回主要的包中某个文件的fullPath全路径
    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *fullPath = [mainBundle pathForResource:@"girls.plist" ofType:nil];

    // 从plist文件中根据全路径,返回字典数组
    NSArray *arrayWithDict = [NSArray arrayWithContentsOfFile:fullPath];

    // 模型的类方法返回对象,参数只要一个字典数组即可
    for (NSDictionary *dict in arrayWithDict) {
        // 参数只要字典,这样一来,控制器就不用知道太多东西了
        Girl *girl = [Girl girlWithDict:dict];
        // 添加到对象数组
        [_girls addObject:girl];
    }
}

#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // 返回行数
    return _girls.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 把cell封装之后,控制 器知道的东西就非常少了~

    // 先从缓存池中,根据ID取出自已的cell类
    GirlCell *girlCell = [tableView dequeueReusableCellWithIdentifier:[GirlCell cellID]];
    if (girlCell == nil) {
        // 如果池中没取到,则类方法,重新生成一个崭新的girlCell,xib界面中指定了重用cellID
        girlCell = [GirlCell girlCell];
    }
    // 设置cell中独一无二的内容
    Girl *girl = [_girls objectAtIndex:indexPath.row];
    // 参数为girl对象,填充其各个成员值到xib中各个控件 ,并返回填充好的cell
    girlCell = [girlCell cellWithGirl:girl];
    // 返回cell
    return girlCell;

}

#pragma mark - 代理方法
// 每一行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 调用类方法,得到xib中的cell的行高
    return [GirlCell cellHeight];
}
// 取消默认点击后,蓝色高亮背景
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

@end

girls.plist

tableViewController层次图

iOS_14_tableViewController_xib创建和封装自定义cell

时间: 2024-11-05 19:01:55

iOS_14_tableViewController_xib创建和封装自定义cell的相关文章

自定义Cell的步骤(封装思想)

一 .用XIB封装View的步骤 1.新建一个xib文件描述一个view的内部结构(假设叫做SDTgCell.xib) ● 2.新建一个自定义的类 (自定义类需要继承自系统自带的view, 继承自哪个类,  取决于xib根对象的Class) ● 3.新建类的类名最好跟xib的文件名保持一致(比如类名就叫做SDTgCell) ● 4.将xib中的控件 和 自定义类的.m文件 进行连线 ● 5.提供一个类方法返回一个创建好的自定义view(屏蔽从xib加载的过程) ● 6.提供一个模型属性让外界传递

iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结

iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结 项目中我们常见的自定义cell主要分为两种 等高cell:如应用列表.功能列表? 非等高cell:如微博列表.QQ聊天页面? 下面对这两类cell的创建方式简单记录各步骤. 等高Cell 等高cell通常有三种创建方式: storyboard自定义cell xib自定义cell 代码创建cell(使用frame计算/使用Autolayout布局) 下面分别记录每种创建步骤: 1. storyboard自定义cell 1.创建一个继

[How to]使用自定义cell进行tableview的创建,适用于cell样式不发生变化的情况。

1.简介 在tableview中又默认的cell格式,其中组织如下: <截取自官网文档> 最终的在页面上默认的cell也只能像上述那样的显示效果,如果这种要是无法满足我们的界面要求,那么我们可以自定义cell来进行创建. 2.实现 目标:我们需要制作如下一个table,它的cell高度宽度和排版都是一样的,所以非常适合使用xib来定制cell. 1. 初始化工程后我们将table的数据存放在plist中: 2.在controller中我们以懒加载的方式将plist数据加载进来 详细方法可参考[

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(一)

iOS开发UI篇-以微博界面为例使用纯代码自定义cell程序编码全过程(一) 一.storyboard的处理 直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线. 项目结构和plist文件 二.程序逻辑业务的处理 第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中) 第二步,字

iOS学习之UI自定义cell

一.自定义Cell 为什么需要自定义cell:系统提供的cell满足不了复杂的样式,因此:自定义Cell和自定义视图一样,自己创建一种符合我们需求的Cell并使用这个Cell.如下图所示的这些Cell都是通过自定义Cell样式实现的: 自定义Cell的步骤: 1.首先创建一个继承于UITableViewCell的类:(这是一个简易的通讯录的自定义cell) @interface RootTableViewCell : UITableViewCell // 联系人头像 @property (non

第?一讲:UITableView 高级 自定义cell , cell自适应高度

一.自定义cell(包括cell的自定义,以及直接赋值的方法) 自定义cell就是创建一个UITableViewCell的子类. 把cell上的控件创建都封装在子类中,简化UIViewController中的代码 示例代码分析:(这个例子包括cell的自定义,以及直接赋值的方法) 1.需要建立tabelViewCell类, 在其中进行cell上控件的添加 2.在tabelViewCell.m中进行初始化,和layoutSubviews的frame布局的操作 tabelViewCell.h定义属性

开发进阶18_通过xib自定义Cell

UITableViewController 继承自ViewController,TableViewController自动给我们添加了dataSource和delegate. 里面只有一个UITableView 1.UITableViewController内部默认会创建一个UITableView *tableView 2.UITableViewController内部tableView的delegate和dataSource就是这个UITableViewController 3.UITable

详细例子构建自定义cell

在实际做项目中,使用系统自带的tableView时,cell的样式单一,不易改变.而使用xib时,能改变cell的样式,但是项目不具有可改性,xib 一旦创立,内容不会改变,这里,利用封装的思想,用纯代码建立自定义cell,数据使用plist文件存储 1.首先建立一个数据模型(moreBang),在头文件中(moreBang.h)定义模型中的属性,并将字典转为模型数据: 在moreBang.m中实现方法:(在对象方法中还可以使用KVC转化) 2.其次,在建立cell的frame模型,设置各个空间

【iOS开发-65】QQ聊天界面案例:自定义cell、图片拉伸处理、NSNotification通知、键盘与视图移动以及输入框左边缩进处理

(1)案例 (2)源代码于素材下载 http://pan.baidu.com/s/1bnpiBCz (3)总结 --还是代码封装.控制器.视图.模型分别独立.里面还有很多代码可以独立出来整一个类. --如果某一个值只有特定的几个数字,那么可以用枚举来定义,注意命名规范 typedef enum{ WPMessageTypeMe=0, WPMessageTypeOther=1 }WPMessageType; --依然是计算一段文字所占据的宽和高 CGSize textMaxSize=CGSizeM