有时需要写一个自定义的UITableView,这里的自定义UITableView指的是自定义列表内容,通常就是实现一个UITableViewCell的子类,如MyTableViewCell。下面先来实现一个自定义组件。
STEP 1.
新建一个Empty Application,这里我就叫MyTableViewTest,勾选ARC选项。
STEP 2.
新建一个ViewController对象,注意不需要生成xib文件,这里我就叫MyViewController
STEP 3.
在AppDelegate.m中指定MyViewController为程序的rootViewController
//指定rootViewController对象 MyTableViewController *controller = [[MyTableViewController alloc]init]; self.window.rootViewController = controller;STEP 4.
新建自定义的列表项的xib文件,新建一个empty interface builder文件,就叫MyUITableViewCell,会自动生成为MyUITableViewCell.xib文件。拖动一个UITableViewCell组件进来,再将不同的组件(如UILabel,UIButton)拖动进该UITableViewCell中,详见截图:
STEP 5.
new一个UITableViewCell的子类,就叫MyUITableViewCell,这个类其实更像一个容器类。并对xib文件中的UILabel和UIButton进行连接。这里有一个需要注意的地方。就是MyUITableViewCell的File's owner是什么并不重要(比如可以是NSObject),只需要将Cell上的UIButton和UILable连接到Cell上即可。怎么连接呢?先在MyUITableViewCell.h中定义对应的property属性,如myLabel和myButton。然后右击UILable弹出一个黑色的框框,选择其中的Referencing Outlets下的New Referencing Outlet,拖到鼠标到左侧的组件MyUITableViewCell上,此时会自动弹出一个黑色的框框,选中myLabel即可。
详见下图:
这里必须讨论一下为什么将组件链接到MyUITabelViewCell上,而不是File's owner。其实刚开始我是直接把组件链接到File's owner上的,但是这样之后就直接报错了。于是就google,找了一段解释,可以看看
Normally you don't have to bother about the File's owner in that case, because when the tableViewinstantiate
the cell from the UINib you
provided / associated with the reuseIdentifier,
it will load all the top-level objects of the nib, and use only the first top-level object that is of classUITableViewCell (or
maybe juste the first top-level-object regardless of the class? but in general you only have your UITableViewCell in
your XIB anyway — without counting the File's
Owner and the First
Responder which are only "proxies").
In fact, when the tableView try to dequeue a cell and don't find a reusable one, so create a new one for you, it uses the UINib you provided quite like this:
NSArray* topLevelObjects = [self.cellNib instantiateWithOwner:nil options:0]; cell = [topLevelObjects objectAtIndex:0];
(That's of course a simplified version just to show the principle, I don't know if it actually call only these exact lines, but it should be quite close)
So the File's Owner is not used in this particular case, and you only need to put a simple customUITableViewCell as the only top-level-object of your XIB file next to the existing File's Owneranf First Responder (that, again, are only "proxies" / "External Objects references" and won't be instantiated and won't be part of the top-level-objects returned byinstantiateWithOwner:options:).
原文地址:http://stackoverflow.com/questions/12590471/uitableview-registernibforcellreuseidentifier
STEP 6.
因为没有为MyViewController生成xib文件,所以我们需要在MyViewController的代码中来手动添加组件,这里在viewDidLoad方法中添加。那么出于调用方便的考虑,可以在MyViewController.h中定义UITableView的属性。当然不要忘了实现UITableView对应的Delegate和Datasource协议。下面是 MyViewController.h:
// // MyTableViewController.h // MyTableViewTest // // Created by wly on 13-10-15. // Copyright (c) 2013年 wly. All rights reserved. // #import <UIKit/UIKit.h> @interface MyTableViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property (nonatomic,strong) IBOutlet UITableView *myTableView; @end
STEP 7.
在MyViewController.m中实现UITableView的代理方法,并将UITableView添加到self.view上即可。MyViewController.m:
// // MyTableViewController.m // MyTableViewTest // // Created by wly on 13-10-15. // Copyright (c) 2013年 wly. All rights reserved. // #import "MyTableViewController.h" #import "MyUITableViewCell.h" @interface MyTableViewController () @end @implementation MyTableViewController @synthesize myTableView; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //由于没有xib文件,即无法通过control建立组件和delegate或datasource之间的链接,这里就需要手动指定了 myTableView = [[UITableView alloc]init]; myTableView.delegate = self; myTableView.dataSource = self; //需要注意一个问题,手动添加组件,总是忘了设置tableview的frame属性,导致组件不可见 myTableView.frame = CGRectMake(0, 0, 320, 568); [self.view addSubview:myTableView]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 10; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 72.0; } -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *tag = @"cellTag"; //一个关键问题 //1.使用自定义的MyUITableViewCell,但是没有使用registerNib,显示空白行 // MyUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tag]; // if(cell == nil) { // cell = [[MyUITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tag]; // } // [cell.myButton setTitle:@"Let's go" forState:UIControlStateNormal]; // [cell.myButton setBackgroundColor:[UIColor redColor]]; //2.使用默认的UITableViewCell,显示正确 // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tag]; // if(cell == nil) { // cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tag]; // } // // [cell.textLabel setText:@"ABC"]; // [cell.textLabel setTextColor:[UIColor redColor]]; // [cell.imageView setImage:[UIImage imageNamed:@"default"]]; //3.使用自定义的MyUITableViewCell,显示正常 static BOOL nibsRegistered = NO; if(!nibsRegistered) { UINib *nib = [UINib nibWithNibName:@"MyUITableViewCell" bundle:nil]; [tableView registerNib:nib forCellReuseIdentifier:tag]; nibsRegistered = YES; } MyUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tag]; [cell.myLabel setText:@"abc"]; return cell; } @end
程序运行结果:
O啦~~~,写了挺久的,终于好啦
转帖请保留出处:http://write.blog.csdn.net/postedit/12745165
工程下载地址:http://download.csdn.net/detail/u011638883/6404331
谢谢!!
Object-C类实例的生命周期:创建对象,接收消息,释放对象
1.创建对象
alloc创建对象,init初始化
举例:NSMutableArray *arrayInstance = [[NSMutableArray alloc] init];
嵌套消息发送:将两个消息合写在一行代码中的做法。
2.发送消息
消息必须写在一对方括号中,包含三部分:
(1)receiver(接收方):指针,指向执行方法的对象;
(2)selector(选择器):将要执行的方法的方法名
(3)arguments(参数):以变量形式传给方法的数值
举例:[arrayInstance addObject:anotherObject]一个参数,发送消息是addObject:
[arrayInstance replaceObjectsInRange:aRange
withObjectsFromArray:anotherArray
range:anotherRange]三个参数,发送消息是replaceObject是InRange:withObjectsFromArray:range
注意:一个类不能有同名的方法
3.释放对象
举例:[arrayInstance release]没有参数
对象释放后,arrayInstance仍然指向NSMutableArray实例曾经的地址,直接使用会报错,因为指向的对象已经不存在。
arrayInstance = nil;指针置空后,不会报错(因此不需要像java那样做空指针判断),但不会执行任何操作。
一)UITableView所在的UIViewController声明两个delegate:UITableViewDelegate和UITableViewDataSource。
二)将UITableView对象的delegate设置成self。
三)根据实际需要实现delegate的具体方法,这里简要介绍一下常用的方法和属性。
(1)- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 该方法返回tableview有多少个section。
(2)- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 该方法返回对应的section有多少个元素,也就是每个section对应有多少个cell。
(3)- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 该方法返回指定的row高度。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 该方法返回指定的section的header view的高度。
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 该方法返回指定的section的footer view的高度。
(4)- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 该方法返回指定row的cell,在此函数中用户可以根据自己的需求定义cell的属性和显示风格等(主标题cell.textLabel,副标题cell.detailTextLabel,背景cell.imageView,图标cell.accessoryType等等)。
(5)- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 该函数返回指定section的header的titile。
(6)- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 该函数返回指定section header的view
(7) -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 用户选中某cell时的回调函数。
(8)- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 该方法获取某一cell对象。
(9)如果想让cell能响应选中事件,但是选中后的颜色不发生改变的话,设置cell.selectionStyle = UITableViewCellSelectionStyleNone。
(10)如果想删除cell之间的分割线,设置
tableview.separatorStyle = UITableViewCellSeparatorStyleNone。
以上介绍的方法及属性仅仅是GRE用到的,另外还有很多方法和属性未涉及。本篇文章只是抛砖引玉,等我们需要用到的时候可以参考xCode的联机帮助手册。