转自: http://www.2cto.com/kf/201202/120764.html

(注:环境Mac OS X Lion 10.7.3 + Xcode 4.2.1 + iOS SDK 5.0.)

一、新建iOS Application工程,选择Single View Application,不要选中Use Storyboard.假设指定的是product name和class prefix都是one,则完成后自动生成代码视图如下图:

该应用默认加载的是oneViewController的view.双击oneViewController.xib,在该xib默认的view上面添加控件UILabel、UIButton和一个UITableView,如下图所示:

在oneViewController头文件和*.m文件中定义和声明三个属性label、button、tableViewCell前两个对应xib界 面上的label和button,最后一个对应于即将创建的xib文件中的tableViewCell,并且将label和button属性和界面上的控 件通过拖拽相互关联,如下图:

oneViewController.h:

oneViewController.m:

二、新建根view为UITableViewCell的xib文件Cell.xib:

无法直接生成根view为UITableViewCell的xib文件,可以通过先新建根view为UIView的xib文件,然后将该xib的根 view删除,再从Library窗口中拖一个Table View Cell到该xib中做为该xib的根view.如下图:

刚生成的时候:

将上面的view删除,拖一个table view cell代替,并且在该table view cell上面添加一个label和一个button,如下图:

设置Table View Cell下面的Cell Label和Cell Button的view Tag分别为1和2:

然后选中上面的File's owner,在identify inspector视图Custom Class中选择对应的加载类为oneViewController:

并且从connections inspector下面的Outlets内的UITableViewCell对象tableViewCell与中间视图窗口中的Objects下面的Table View Cell相拖拽连接:(图XXX)

在Attributes inspector中设置Table View Cell的identifier为:CellIdentifier:

保存。

三、代码中动态加载Table View Cell XIB:

打开oneViewController.h让oneViewController实现协议UITableViewDataSource,UITableViewDelegate,即:

oneViewController.m中实现下面的接口方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return20;

}

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with

dequeueReusableCellWithIdentifier:

// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    staticNSString *CustomCellIdentifier =@"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];

    if (cell ==nil) {

        NSArray *nib = [[NSBundlemainBundle]loadNibNamed:@"Cell" owner:selfoptions:nil];

        //        if ([nib count] > 0) {

        //            cell = self.tableViewCell;

        //        } else {

        //            NSLog(@"failed to load CustomCell nib file!");

        //        }

        cell = [nib objectAtIndex:0]; // 注释掉的和该句是两种方式,在这里两种方式都行。但是如果没有上面红色处(图XXX)的拖拽连接过程,这里只能使用nib objectAtIndex方式。

    }

    NSUInteger row = [indexPathrow];

NSLog(@"++++++++++++++ jonesduan %s, cell row:%d", __func__, row);

UILabel *cellLabel = (UILabel *)[cellviewWithTag:1];

    cellLabel.text = [NSStringstringWithFormat:@"cell index: %d", row];

UIButton *cellButton = (UIButton *)[cellviewWithTag:2];

    [cellButton setTitleColor:[UIColorredColor]forState:UIControlStateNormal];

    [cellButton setTitleColor:[UIColororangeColor]forState:UIControlStateHighlighted];

    [cellButton setTitle:@"Press me!"forState:UIControlStateNormal];

    [cellButton setTitle:@"Pressed!"forState:UIControlStateHighlighted];   

    return cell;

}

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Modified by jonesduan.

    return80;

}

- (void)didReceiveMemoryWarning

{

    [superdidReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.

}

#pragma mark - View lifecycle

- (void)viewDidLoad

{

    [superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

    [self.labelsetBackgroundColor:[UIColorgrayColor]];

    [self.buttonsetTitleColor:[UIColorgreenColor]forState:UIControlStateNormal];

    [self.buttonsetTitleColor: [UIColororangeColor]forState:UIControlStateHighlighted];//这里控制的是 oneViewController.xib中的label和button,前面已经拖拽连接过。

}

这样完成后。CMD + R运行一下看看,发现界面如下图所示:

并没有显示Cell.xib中的Cell Label和Cell Button,下面是最重要的一点,也是一个人研究了很久才知道的,即:选中oneViewController.xib中view下的子Table View,切换到connections inspector,将Table View的dataSource和delegate均与File's owner相拖拽进行连接。如下图:

连完后,再CMD + R运行看看,结果是不是就如下图所示了,

OK,成功!

总结:通过xib自定义view比较重要的一点就是这个view被哪个view controller使用,比如xxxViewController,就要在identity inspector中Custom Class指定对应的加载类为xxxViewController,然后选中File's owner(中间大窗口中的Placeholders下),并切换到connections inspector将Outlets下面的对象与中间大窗口中的Objects(与Placeholders同级别,在Placeholders下面)下
的根视图相连接。最后别忘了Table View的dataSource和delegate均与File's owner相拖拽进行连接。

APPLE开发最不习惯的就是拖拽连接,在此记录一下作为个人参考,免得以后忘记了。

demo下载地址:http://download.csdn.net/detail/duanyipeng/4063778

Xib设计UITableViewCell然后动态加载的更多相关文章

  1. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  2. 携程Android App的插件化和动态加载框架

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  3. 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载

    在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...

  4. 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题

    继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...

  5. 解决tableView中cell动态加载控件的重用问题

    解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...

  6. Win8 Metro动态加载内容框架

    制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 ...

  7. [AngularJS] 使用AngularAMD动态加载Service

    [AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...

  8. C#动态加载树菜单

    在做权限系统的时候,需要有一个树形的菜单.下图就是一个树形菜单的样式 但问题是,我们可以实现写死的树形菜单.什么是写死的?就是在前台代码中写好要加载的树形菜单是什么样子的.但是我们权限系统的要求是动态 ...

  9. 在Unity3D的网络游戏中实现资源动态加载

    用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...

随机推荐

  1. 关于在页面得到的servlet验证码总是上一次保存在session中的

    在网上找到一份servlet产生验证码的代码,经过测试,发现在页面通过session.getAttribute()方法得到的验证码总是上一次保存在session中的,这样,它总比页面实际的验证码晚一拍 ...

  2. HDU3887 Counting Offspring [2017年6月计划 树上问题03]

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. 洛谷P2982 [USACO10FEB]慢下来Slowing down [2017年四月计划 树状数组01]

    P2982 [USACO10FEB]慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) c ...

  4. 洛谷P1877 [HAOI2012]音量调节 [2017年4月计划 动态规划05]

    P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...

  5. Intellij IDEA 创建资源文件夹 source folder

    [转载]原文链接:https://blog.csdn.net/u014723529/article/details/78050725 之前用 eclipse 新建有一个 source folder , ...

  6. 浅谈mybatis中#{}和${}的区别

    #{}:表示占位符,如果获取简单类型,#{}中可以使用value或其它名称.有效防止sql注入.使用#{}设置参数无需考虑参数的类型. 如果使用#{}比较日期字段,select* from table ...

  7. LUGOU 3959 宝藏 (noip 2017 day2 T2)

    传送门 解题思路 去年noip现在拿来写..思路还是听清楚的,记忆化搜索,f[S]表示现在选了集合S时的最小代价,dis[i]表示达到最优时i这个点的深度.f[S| (1< < i-1) ...

  8. webpack--安装,使用

    1. webpack 1.1. webpack介绍 webpack是一个资源的打包工具,目前最新为webpack3,可以将 .js, .css , image等静态资源当做一个模块来进行打包,那么每一 ...

  9. 2017年浙工大迎新赛热身赛 L cayun日常之赏月【易错特判】

    题目描述(https://www.nowcoder.com/acm/contest/51#question) 在cayun星球月亮大小都有一个规律,月亮为每30天一个周期,在这30天的周期里,月亮的大 ...

  10. [leetcode] Reverse Words in a String [1]

    一.题目: Given an input string, reverse the string word by word. For example, Given s = "the sky i ...