tableview的简单使用

tableview的简单使用,第1张

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表当前悬浮的区头等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9626573.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存