确定第一个和最后一个UITableViewCell

时间:2012-03-30 13:44:20

标签: iphone objective-c ios uitableview

我有一个包含3个部分的UITableView,每个部分都返回numberOfRows 3个独立数组中的计数。在我的cellForRow中,我需要能够检测哪个单元格是表格中的第一个单元格,哪个单元格是最后一个单元格。

棘手的部分是,有时一个部分可以为行数返回0,所以我很难搞清楚这一点。我要做的就是设置两个标志:isTopCellisBottomCell。有什么想法吗?

- (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。我只需要一名获胜者。

8 个答案:

答案 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将为nilip_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检索的元素与累积数组的第一个和最后一个元素进行比较。