Xib设计UITableViewCell然后动态加载
转自: 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然后动态加载的更多相关文章
- 携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- 携程Android App的插件化和动态加载框架
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载
在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...
- 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题
继上一篇 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 解决了后台业务系统的部分动态加载问题,然而该框架离正常的用户体验还存在一些问题,如:浏览器的前进.后 ...
- 解决tableView中cell动态加载控件的重用问题
解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...
- Win8 Metro动态加载内容框架
制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 ...
- [AngularJS] 使用AngularAMD动态加载Service
[AngularJS] 使用AngularAMD动态加载Service 前言 「使用AngularAMD动态加载Controller」:这篇文章里介绍如何使用AngularAMD来动态加载Contro ...
- C#动态加载树菜单
在做权限系统的时候,需要有一个树形的菜单.下图就是一个树形菜单的样式 但问题是,我们可以实现写死的树形菜单.什么是写死的?就是在前台代码中写好要加载的树形菜单是什么样子的.但是我们权限系统的要求是动态 ...
- 在Unity3D的网络游戏中实现资源动态加载
用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...
随机推荐
- [DEPRECATION] Encountered positional parameter near xxx Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
WARN:30 20:55:45,340ms- [HqlSqlWalker]1009行-[DEPRECATION] Encountered positional parameter near line ...
- Orleans 整体介绍
背景 Orleans 是微软开源的Actor模型开发框架. Actor模型 此模型解决了并发编程时对资源竞争使用的问题,将对同一个业务数据的访问从并行变为串行执行,降低了多线程编程的难度,使普通编程人 ...
- 2019.10.22 csp-s模拟测试82 反思总结
重来重来,刚刚就当什么都没发生 今天的题属实有些迷惑,各种意义上…总之都很有难度吧.不满归不满,这套题的确不是什么没有意义的题目. 为了考验自己的学习能力记忆力,决定不写题解,扔个代码完事了 其实是懒 ...
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- 2017-09-23-ArchData
layout: post title: ArchData category: Technical tags: [分布式,区块链,AI,大数据] ArchData 技术峰会 神经网络和函数式编程 杨博: ...
- 七.RBM受限玻尔兹曼机
1.受限玻尔兹曼机 玻尔兹曼机是一大类的神经网络模型,但是在实际应用中使用最多的则是受限玻尔兹曼机(RBM). 受限玻尔兹曼机(RBM)是一个随机神经网络(即当网络的神经元节点被激活时会有随机行为 ...
- Leetcode3.Longest Substring Without Repeating Characters无重复字符的最长字串
给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...
- 大合集 | 9 场 Dubbo Meetup 回顾视频和PPT下载
2018年2月16日,Dubbo 加入 Apache 基金会孵化器,在随后的那个夏天,我们开始在全国(北京.上海.深圳.成都.杭州)和社区的用户们见面.认识.交个朋友,将社区的最新动态.Dubbo 的 ...
- POJ 2078
16ms 解法: #include <cstdio> //using namespace std; ][]; ][]; ]; ]; int n,min,max; void solve(in ...
- svn upgrade
在我们把我们服务器上的svn 版本号升级以后,我们之前的代码再执行svn命令时,会提示需要执行svn upgrade命令把当前的代码由低版本的svn 上迁移到高版本的svn 上去. 直接执行svn u ...