UITableView是app开发中常用到的控件,功能很强大,多用于数据的显示。
初始化tableview后,要想显示数据,就必须遵守tableview的数据源代理,而且实现以下方法否则程序会崩溃:
-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath
该方法决定了tableview的每一行显示什么内容,返回值为UITableViewCell,可以通过设置UITableViewCell的各种属性(image,label)从而达到想要的效果,或者自定义Cell,关于自定义cell在后面会做相关介绍
- (NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section;
该方法决定了每一组(section)中有几个cell
- (NSInteger)numberOfSectionsInTableView:(UITableView )tableView;
该方法决定了tabview显示几组,这个方法不一定要实现,如果不实现默认显示一组
如果想要实现对tableview 的 *** 作(如:点击每一个cell能获得相应)则必须遵守UITableViewDelegate协议,成为代理
以下是几个比较常用的方法
- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath;
该方法可以设置每个cell 的高度
- (nullable UIView )tableView:(UITableView )tableView viewForHeaderInSection:(NSInteger)section;
该方法可以自定义每个组的头部(,按钮等等)
- (nullable UIView )tableView:(UITableView )tableView viewForFooterInSection:(NSInteger)section;
该方法可以自定义每个组的尾部(,按钮等等)
- (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath;
该方法获取当前点击的cell的indexPath(结构体,包括了section和row)
如何复制粘贴剪切一个cell
遵守UITableViewDelegate协议,并实现以下方法
该方法决定在长按cell后 是否显示 复制粘贴 菜单
-(BOOL)collectionView:(UICollectionView )collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath )indexPath{
return YES;
}
该方法决定 菜单上显示什么按钮
-(BOOL)collectionView:(UICollectionView )collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath )indexPath withSender:(id)sender{
// 不显示剪切的按钮
if (action==@selector(copy:)||action==@selector(paste:)) {
return YES;
}else{
return NO;
}
}
该方法决定 点击菜单上的复制粘贴按钮 后干啥
-(void)collectionView:(UICollectionView )collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath )indexPath withSender:(id)sender{
if (action==@selector(copy:)) {
NSLog(@"copy!");
}else if(action==@selector(paste:)){
NSLog(@"paste!");
}
cell 的编辑
设置cell能否被编辑
-(BOOL)tableView:(UITableView )tableView canEditRowAtIndexPath:(NSIndexPath )indexPath{
return YES;
}
设置删除按钮的文字
-(NSString )tableView:(UITableView )tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath )indexPath{
return @"删除";
}
实现cell 的编辑,通过editingStyle做不同 *** 作
editingStyle:是编辑模式是枚举类型,有以下三种
UITableViewCellEditingStyleNone,
UITableViewCellEditingStyleDelete,
UITableViewCellEditingStyleInsert
-(void)tableView:(UITableView )tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath )indexPath
{
}
UITableViewCell的使用
创建TableViewCell
UITableViewCell cell=[UITableViewCell alloc]initWithStyle:<#(UITableViewCellStyle)#> reuseIdentifier:<#(nullable NSString )#>]
reuseIdentifier:重用标识符,定义重用标识符可以实现cell的复用、
TableViewCell的重用:
UITableViewCell cell = [tableView dequeueReusableCellWithIdentifier:@"newscell"];
//复用重用标识符为newscell的cell
if (cell == nil) {
//没有重用标识符为newsreel的cell 创建一个cell并且设置重用标识符
cell=[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"newsreel"];
}
//注册tableviewcell,这样就不需要对cell进行为空判断
[tableView registerClass:<#(nullable Class)#> forCellReuseIdentifier:<#(nonnull NSString )#>]
//使用xib创建cell,使用下面的方法进行tableviewcell的注册
[tableView registerNib:<#(nullable UINib )#> forCellReuseIdentifier:<#(nonnull NSString )#>]
首先定义一个标识符数组,用来表示每个section的展开收起状态
设置每个section的row个数的方法中,加入一个对标识符的判断
判断为 展开,即按照设定的个数来显示row(每个section的row个数,可以存在一个数组里)
判断为收起,则返回0
在header上添加button,绑定方法
方法中,根据button的tag值来判断点击的是哪个section,然后对响应section的标识符进行更改
基本流程就这样了
我写的练习代码供参考(没粘贴变量的声明部分,新手,见笑了):
#pragma mark - Other Method
//点击header的方法
-(void)tapHeader:(UIButton )sender
{
if ([[openedInSectionArr objectAtIndex:sendertag - 100] intValue] == 0) {
[openedInSectionArr replaceObjectAtIndex:sendertag - 100 withObject:@"1"];
NSLog(@"%d打开",sendertag);
}
else
{
[openedInSectionArr replaceObjectAtIndex:sendertag - 100 withObject:@"0"];
NSLog(@"%d关闭",sendertag);
}
[myTableView reloadData];
}
#pragma mark - TableView Method
-(NSInteger)numberOfSectionsInTableView:(UITableView )tableView
{
return [mySectionArr count];
}
-(CGFloat)tableView:(UITableView )tableView heightForHeaderInSection:(NSInteger)section
{
return 40;
}
-(UIView )tableView:(UITableView )tableView viewForHeaderInSection:(NSInteger)section
{
UIView mySectionView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)] autorelease];
mySectionViewbackgroundColor = [UIColor orangeColor];
UIButton myButton = [UIButton buttonWithType:UIButtonTypeCustom];
myButtonimageViewimage = [UIImage imageNamed:@"淡蓝头png"];
myButtonframe = CGRectMake(0, 0, 320, 40);
myButtontag = 100 + section;
[myButton addTarget:self action:@selector(tapHeader:) forControlEvents:UIControlEventTouchUpInside];
[mySectionView addSubview:myButton];
UILabel myLabel = [[UILabel alloc] initWithFrame:CGRectMake(35, 0, 150, 30)];
myLabelbackgroundColor = [UIColor clearColor];
myLabeltext = [mySectionArr objectAtIndex:section];
[myButton addSubview:myLabel];
[myLabel release];
return mySectionView;
}
-(NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section
{
// 判断section的展开收起状态
if ([[openedInSectionArr objectAtIndex:section] intValue] == 1) {
return [[rowOfSectionArr objectAtIndex:section] intValue];
}
return 0;
}
-(void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath
{
[selfnavigationController pushViewController:memberInfoVC animated:YES];
}
-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath
{
NSString string = @"cell";
UITableViewCell cell = [tableView dequeueReusableCellWithIdentifier:string];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:string] autorelease];
}
celltextLabeltext = [mySectionArr objectAtIndex:indexPathsection];
return cell;
}
#pragma mark - View lifecycle
// Implement loadView to create a view hierarchy programmatically, without using a nib
- (void)loadView
{
UIView myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
myViewbackgroundColor = [UIColor groupTableViewBackgroundColor];
selfview = myView;
[myView release];
memberInfoVC = [[MemberInfo alloc] init];
// sectionheader文字
mySectionArr = [[NSMutableArray alloc] initWithObjects:@"猪头", @"笨蛋", @"傻瓜", @"神经病", nil];
// 每个section中的row个数
rowOfSectionArr = [[NSMutableArray alloc] initWithObjects:@"2", @"3", @"4", @"2", nil];
// 每个section展开收起状态标识符
openedInSectionArr = [[NSMutableArray alloc] initWithObjects:@"0", @"0", @"0", @"0",nil];
myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 418) style:UITableViewStylePlain];
myTableViewdataSource = self;
myTableViewdelegate = self;
[selfview addSubview:myTableView];
[myTableView release];
}
你说的plain表是指的静态的tableView吗 还有你是想要获得headView还是当前表格的sectionView 如果是要获得当前的sectionView的话,你先获得当前表格显示的IndexPath,获得了indexPath了基本上都能获得了。
两个注意点:
1默认tableview分组样式,每组section有额外头部和尾部间距,如果每组之间的间距一致,可以调整tableview的两个属性sectionHeaderHeight和sectionFooterHeight
2如果有导航条和tabbar,tableview的内容视图也有自己额外的头部和尾部间距,这两个间距是内边距,是可调整的,内容视图中包含cell控件
要求:
1tableview的分组样式,每组之间距离很大,特别是第一个cell和导航栏之间的距离,不好看,所以需要调整seciton之间的间距,
2当UITableView的style为UITableViewStyleGrouped时,section之间默认的距离往往不是我们想要的。那怎么设置呢?我们知道每个section都有自己的header和footer,它们的高度和就是section之间的间距
selftableViewsectionHeaderHeight = 10;
selftableViewsectionFooterHeight = 10;
那section之间的距离就是20(10 +10)了,默认是18+18,注意第一组cell是没有头部间距的只有尾部间距
3第一组离导航栏的距离如何调节?
分组样式的第一个cell的默认y值是35,要想间距为10,必须上移25,但这个上移应该是内容视图整体的上移,应该调整tableview头部的内边距
selftableViewcontentInset = UIEdgeInsetsMake(-25, 0, 0, 0);
总结:
如果是调节section之间的距离,就一起调整两个属性,如果是整体上移,就调节内边距属性contentInset
1UITableViews存储他们的NSIndexPath。因此存在对部分没有对象。使用下面的代码就可以遍历表并执行的可见部分索引(我不知道你为什么想要看到的部分,因为他们看到,目前在屏幕上,但不管)。
for (NSIndexPath i in [yourTableViewName indexPathsForVisibleRows])
{
NSUInteger sectionPath = [i indexAtPosition:0];
//custom code here, will run multiple times per section for each visible row in the group
}
2
或者非常简单的方法是采取valueForKeyPath和的NSSet类的优势: NSSet visibleSections = [NSSet setWithArray:[[selftableView indexPathsForVisibleRows] valueForKey:@"section"]];
基本上,你在可见的行的部分值的数组,然后填入一组与此删除重复。
3
我已经得到了解决。 第一步,每个部分会显示,创建一个UIView- (UIView )tableView:(UITableView
)tableView viewForHeaderInSection:(NSInteger)section,将被存储到数组中。
当TableView中滚动,我想免费的无形剖面图,所以我需要知道哪些部分是可见或不可见,请按功能代码会检测这个目的,如果视图是可见的,然后释放它。 -(BOOL)isVisibleRect:(CGRect)rect containerView:(UIScrollView)containerView
{
CGPoint point = containerViewcontentOffset;
CGFloat zy = pointy ;
CGFloat py = rectoriginy + rectsizeheight;
if (py - zy <0) {
return FALSE;
}
CGRect screenRect = containerViewframe;
CGFloat by = screenRectsizeheight + zy ;
if (rectoriginy > by) {
return FALSE;
}
return TRUE;
}
(rect是该部分的UIView;containerView是UITableView)
通过这种方式,我可以得到的可见部分UITableView,但我希望在SDK可以用于此目的直接提供的API。
4 从可见的行列表中提取部分: NSArray indexPathsForVisibleRows = [tableView indexPathsForVisibleRows];
NSMutableIndexSet indexSet = [NSMutableIndexSet indexSet];
for ( NSIndexPath indexPath in indexPathsForVisibleRows ) {
[indexSet addIndex:indexPathsection];
}
NSLog(@"indexSet %@",indexSet);
// indexSet <NSMutableIndexSet: 0x11a5c190>[number of indexes: 5 (in 1 ranges), indexes: (9-13)]
或: NSArray indexPathsForVisibleRows = [detailTableView indexPathsForVisibleRows];
NSMutableSet sectionSet = [NSMutableSet set];
for ( NSIndexPath indexPath in indexPathsForVisibleRows ) {
[sectionSet addObject:[NSNumber numberWithInt:indexPathsection]];
}
NSLog(@"sectionSet %@",sectionSet);
// sectionSet {(13, 11, 9, 10, 12 )}
5 另一种解决方案,可以使用在你的节头视图中的标签1位,这样的 #define _TBL_TAG_SECTION(_TAG) ((_TAG)|(1<<30))
#define _TBL_TAG_CLEAR(_TAG) ((_TAG)&((1<<30)-1))
#define _TBL_TAG_IS_SECTION(_TAG) ((_TAG)>>30)
- (UIView)tableView:(UITableView )tableView viewForHeaderInSection:(NSInteger)section
{
// alloc header view
UIView header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
headertag = _TBL_TAG_SECTION(section);
return header;
}
- (void)scrollViewDidScroll:(UIScrollView )scrollView
{
CGRect r = CGRectMake(scrollViewcontentOffsetx, scrollViewcontentOffsety,
CGRectGetWidth(scrollViewframe),
CGRectGetHeight(scrollViewframe));
for (UIView v in [_tableView subviews]) {
if ( CGRectIntersectsRect(r, vframe) ) {
if ( _TBL_TAG_IS_SECTION(vtag) ) {
NSLog(@"visible section tag %d", _TBL_TAG_CLEAR(vtag));
}
}
}
}
6 2步解决方案,以获得在一个UITableView可见部分:
1)添加标题视图一个可变数组viewForHeaderInSection2)更新数组时,在滚动的tableviewscrollViewDidScroll注Tag属性来保存部分的数量
@property (nonatomic, strong, readwrite) NSMutableArray headerArray;
- (UIView )tableView:(UITableView )tableView viewForHeaderInSection:(NSInteger)section {
UIView headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableViewboundssizewidth, 40)];
headerViewbackgroundColor = [UIColor greenColor];
headerViewtag = section;
[_headerArray addObject:headerView];
return headerView;
}
- (void)scrollViewDidScroll:(UIScrollView )scrollView {
[self updateHeaderArray];
NSLog(@"------------");
for (UIView view in _headerArray) {
NSLog(@"visible section:%d", viewtag);
}
}
- (void)updateHeaderArray {
// remove invisible section headers
NSMutableArray removeArray = [NSMutableArray array];
CGRect containerRect = CGRectMake(_tableViewcontentOffsetx, _tableViewcontentOffsety,
_tableViewframesizewidth, _tableViewframesizeheight);
for (UIView header in _headerArray) {
if (!CGRectIntersectsRect(headerframe, containerRect)) {
[removeArray addObject:header];
}
}
[_headerArray removeObjectsInArray:removeArray];
}
7 答案是简单了很多,并用简洁KVC NSArray visibleSections = [selftableViewindexPathsForVisibleRows valueForKey:@"section"];
这可能给你重复的值的数组,但你可以从那里管理。
-(CGFloat)tableView:(UITableView )tableView heightForFooterInSection:(NSInteger)section{
return 100;
}
- (UIView )tableView:(UITableView )tableView viewForFooterInSection:(NSInteger)section{
UIView bgv = [[UIView alloc]initWithFrame:CGRectMake(0, 0, APPWIDTH, 10)];
bgvbackgroundColor = [UIColor colorWithWhite:5 alpha:1];
return bgv;
}
你把你添加的line删除 加到上述bgv里面
直接用tableview的datasource的numberOfSectionsInTableView和numberOfRowsInSection就可以取到最后一个cell的indexPath,再跟目标cell的indexPath一比就行了。
点击一个cell 高度增加,tableview初始化是4个cell的大小,当点击第四个cell的时候 高度增加了,cell里增加的部分在tableview的下面,看不到了,需要向上拖动tableview才行,这样用户体验不好。
现在的情况是,点击一个cell时,增加了高度,当点击的下一个cell在上次点击的cell的下面,高度增加的时候是向上的方向上增加的,如果在上次点击的cell上面就向下的方向增加,能不能自动判断当前cell在tableview中的位置,
根据当前位置决定增加高度的方向。
以上就是关于tableview的简单使用全部的内容,包括:tableview的简单使用、如何收起和展开UITableView Sections、iOS开发中 怎么获取plain表当前悬浮的区头等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)