我有一个包含3个部分的UITableView,每个部分都返回numberOfRows 3个独立数组中的计数。在我的cellForRow中,我需要能够检测哪个单元格是表格中的第一个单元格,哪个单元格是最后一个单元格。
棘手的部分是,有时一个部分可以为行数返回0,所以我很难搞清楚这一点。我要做的就是设置两个标志:isTopCell
和isBottomCell
。有什么想法吗?
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(section==0)
return [array1 count];
else if(section==1)
return [array2 count];
else return [array3 count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(/*something, what I'm trying to figure out*/)
isTopCell=YES;
if(/*something, what I'm trying to figure out*/)
isBottomCell=YES;
}
编辑:让我澄清一下。这三个部分是统一的。我想确定整个顶部和底部单元格。 if(indexPath.row == 0)将为3个部分返回true。我只需要一名获胜者。
答案 0 :(得分:2)
试试这个:
int index = indexPath.row;
if (indexPath.section > 0) index += [array1 count];
if (indexPath.section > 1) index += [array2 count];
if (index == 0) // Top row
if (index == [array1 count] + [array2 count] + [array3 count] - 1) // Bottom row
答案 1 :(得分:1)
没有什么比这更棘手的了。这里是任意数量的部分:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger totalIndex = indexPath.row;
NSInteger numberOfSections = [self numberOfSectionsInTableView:tableView];
NSInteger totalNumberOfRows = 0;
for (NSInteger currentSection = 0; currentSection < numberOfSections; currentSection ++) {
NSInteger rowsInSection = [self tableView:tableView numberOfRowsInSection:currentSection];
totalNumberOfRows += rowsInSection;
if (currentSection < indexPath.section) totalIndex += rowsInSection;
}
BOOL isTopCell = (totalIndex == 0);
BOOL isBottomCell = (totalIndex == totalNumberOfRows);
}
答案 2 :(得分:1)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
BOOl isTopCell = NO;
BOOl isBottomCell = NO;
int totalNumberOfCells = [array1 count] + [array2 count] + [array3 count];
int cellOverallPosition = 0;
switch (indexPath.section) {
case 0: { cellOverallPosition = indexPath.row; } break;
case 1: { cellOverallPosition = indexPath.row + [array1 count]; } break;
case 2: { cellOverallPosition = indexPath.row + [array1 count] + [array2 count]; } break;
}
if (cellOverallPosition == 1) { isTopCell = YES; }
if (cellOverallPosition == totalNumberOfCells) { isBottomCell = YES; }
//Other cell stuff follows
}
答案 3 :(得分:1)
诀窍不是依赖于你的cellForRowAtIndexPath
,因为它仅针对屏幕上可见的单元格运行。我建议您在numberOfSectionsInTableView
中找出相关内容。这是应该工作的代码。首先,我们为您的.h
文件添加两个索引路径:
@interface MyTable : UITableViewController {
...
NSIndexPath *ip_top;
NSIndexPath *ip_bottom;
}
@property (nonatomic, retain) NSIndexPath *ip_top;
@property (nonatomic, retain) NSIndexPath *ip_bottom;
在.m
文件中:
...
@implementation MyTable
@synthesize ip_top;
@synthesize ip_bottom;
当然我们需要在dealloc
:
- (void)dealloc {
[ip_top release];
[ip_bottom release];
}
现在让我们了解逻辑的肉和骨头。首先,我们将修改numberOfSectionsInTableView
,因为每次加载/重新加载表时它都会运行一次:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tv {
NSLog(@"Getting number of sections");
self.ip_top = self.ip_bottom = nil;
int i_numSections = 3;
int i_numRows;
for (int i=0; i<i_numSections; i++) {
i_numRows = [self tableView:tv numberOfRowsInSection:i];
NSLog(@"num_rows:%d for section:%d",i_numRows,i);
if (i_numRows > 0) {
if (!ip_top) {
self.ip_top = [NSIndexPath indexPathForRow:0 inSection:i];
}
self.ip_bottom = [NSIndexPath indexPathForRow:i_numRows-1 inSection:i];
}
}
NSLog(@"top:%@ bottom:%@",ip_top,ip_bottom);
return i_numSections;
}
请注意,它会找到第一个包含多行的第一部分,并将ip_top
指向,否则ip_top
将为nil
。 ip_bottom
的类似逻辑将指向最后一行。现在我们需要在cellForRowAtIndexPath
:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
if ([indexPath compare:ip_top] == NSOrderedSame) {
NSLog(@"top cell section:%d row:%d",indexPath.section,indexPath.row);
}
if ([indexPath compare:ip_bottom] == NSOrderedSame) {
NSLog(@"bottom cell section:%d row:%d",indexPath.section,indexPath.row);
}
...
}
有意义吗?去吧!
答案 4 :(得分:0)
第一个
if(indexPath.row == 0)
为最后一次
if(indexPath.row == sectionarray.count - 1)
和sectionarray我的意思当然是你的数组1-3 你必须确定与
一起使用indexPath.section
将为您返回值0,1,2 3个部分=)
或者你可以得到那样的计数
[self tableView:tableView numberOfRowsInSection:indexPath.section]
答案 5 :(得分:0)
这适用于任何表视图 - 每个部分中的任意数量的部分和任意数量的行。它还处理只有一行的情况(通过将行检测为顶行和底行)。只需将其添加到cellForRowAtIndexPath
方法的顶部即可。
BOOL isTop = NO;
BOOL isBottom = NO;
int sections = [self numberOfSectionsInTableView:tableView];
if (indexPath.row == 0) {
// Could be first
isTop = YES;
for (int i = indexPath.section-1; i>=0; i--) {
if ([self tableView:tableView numberOfRowsInSection:i] > 0) {
// Non-empty section above this one, so not first.
isTop = NO;
break;
}
}
}
if (indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section]-1) {
// Could be last
isBottom = YES;
for (int i = indexPath.section + 1; i < sections; i++) {
if ([self tableView:tableView numberOfRowsInSection:i] > 0) {
// Non-empty section below this one, so not last.
isBottom = NO;
break;
}
}
}
答案 6 :(得分:0)
我在我的项目中所做的是,我已经设置了表视图的1和最后一个单元格的图像,这将与其他单元格不同
我使用以下代码
//
// Set the background and selected background images for the text.
// Since we will round the corners at the top and bottom of sections, we
// need to conditionally choose the images based on the row index and the
// number of rows in the section.
//
UIImage *rowBackground;
UIImage *selectionBackground;
NSInteger sectionRows = [aTableView numberOfRowsInSection:[indexPath section]];
NSInteger row = [indexPath row];
if (row == 0 && row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"topAndBottomRow.png"];
selectionBackground = [UIImage imageNamed:@"topAndBottomRowSelected.png"];
}
else if (row == 0)
{
rowBackground = [UIImage imageNamed:@"topRow.png"];
selectionBackground = [UIImage imageNamed:@"topRowSelected.png"];
}
else if (row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"bottomRow.png"];
selectionBackground = [UIImage imageNamed:@"bottomRowSelected.png"];
}
else
{
rowBackground = [UIImage imageNamed:@"middleRow.png"];
selectionBackground = [UIImage imageNamed:@"middleRowSelected.png"];
}
((UIImageView *)cell.backgroundView).image = rowBackground;
((UIImageView *)cell.selectedBackgroundView).image = selectionBackground;
//
#endif
让我知道它是否有效 干杯!!!!
答案 7 :(得分:0)
我假设你只需要整个表的顶部和底部,而不是每个部分。首先想到的是创建一个数组,它是array1,array2和array3的连接内容。然后,当您在cellForRowAtIndexPath:中执行常规单元格配置时,将使用section和row检索的元素与累积数组的第一个和最后一个元素进行比较。