UITableViewCell如何知道自己的indexPath?

时间:2009-07-28 15:23:52

标签: iphone uitableview

标准的分组UITableView样式允许UITableViewCell在每个部分的顶部和底部绘制圆角。这是如何完成的?单元格如何在其截面内知道自己的位置,以及它如何知道何时更改其圆边?

我想制作自己的圆形单元格,并且我有要使用的图像,但不知道何时显示哪个图像

注意:我已经知道UITableView是如何工作的,我知道如何使用它。我只是认为,因为UITableView能够在正确的位置自动绘制圆角,所以我也应该能够,无需向我的数据源或委托添加任何内容。

11 个答案:

答案 0 :(得分:61)

NSIndexPath *indexPath = [(UITableView *)self.superview indexPathForCell: self];
int rows = [(UITableView *)self.superview numberOfRowsInSection:indexPath.section];

if (indexPath.row == 0 && rows == 1) {
// the one and only cell in the section
}
else if (indexPath.row == 0) {
//top
}
else if (indexPath.row != rows - 1) {
//middle
}
else {
//bottom
}

答案 1 :(得分:32)

这很简单。假设单元格是对象,其位置将被发现。

  UITableView* table = (UITableView *)[cell superview]; 
  NSIndexPath* pathOfTheCell = [table indexPathForCell:cell]; 
  NSInteger sectionOfTheCell = [pathOfTheCell section]; 
  NSInteger rowOfTheCell = [pathOfTheCell row];

答案 2 :(得分:8)

sectionLocation UITableViewCell方法返回整数,告诉您需要什么:

  • 1 - 中间单元
  • 2 - 顶部单元格
  • 3 - 底部细胞
  • 4 - 单细胞

自2010年以来,我在几个制作应用程序中使用它没有任何问题。

更新:我们的一个二进制文件最近被自动拒绝(2018年底)因为我们使用的是“sectionLocation”属性,所以它不再是一个好的选择。

在头文件中添加这样的内容,您可以使用它:

typedef NS_ENUM(NSInteger, MMMTableViewCellLocation) {

    MMMTableViewCellLocationUndefined = 0,
    MMMTableViewCellLocationMiddle = 1,
    MMMTableViewCellLocationTop = 2,
    MMMTableViewCellLocationBottom = 3,
    MMMTableViewCellLocationSingle = 4
};

@interface UITableViewCell ()

/** Undocumented method of UITableViewCell which allows to know where within section the cell is located,
 * so the cell can draw its borders properly. */
- (MMMTableViewCellLocation)sectionLocation;

/** Override this one to know when the value of sectionLocation changes. */
- (void)setSectionLocation:(MMMTableViewCellLocation)sectionLocation animated:(BOOL)animated;

@end

答案 3 :(得分:4)

您可以使用

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell

这个问题。在我的示例中,我使用它将单元格(带有自定义内容)滚动到视图的顶部。

答案 4 :(得分:1)

如果您需要更强大和更通用的内容,请查看http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html - Matt Gallagher非常有效地展示了您的需求。他基本上从UIViewController重新创建了UITableViewController,同时添加了使用自己的自定义图形的能力。我正在努力将这个应用到我的一个项目中,到目前为止看起来它可以完成这项工作。

答案 5 :(得分:0)

不幸的是,我找不到解决这个问题的方法,并且已经将UITableViewController和UITableViewCell子类化为一个通用解决方案,我可以根据需要进行扩展。

答案 6 :(得分:0)

你不要在单元格中执行此操作。圆角在[tableView viewForHeaderInSection]和viewForFooterInSection中绘制。

我这样做的方法是使用普通的tableview样式,然后将这两个视图用于圆度,单元格是正常的,没有轮次。

答案 7 :(得分:0)

如果不进入谁绘制的内容,您可以非常轻松地知道哪个单元格是cellForRowAtIndexPath内部的最后一个单元格。

你传递了你需要提供的单元格的indexPath,对吧?你也传递了tableView。

调用[tableView numberofRowsInSection:indexPath.section],如果它是==([indexPath.row] -1),你知道你被要求提供该部分的最后一个单元格。

在调用cellForRowAtIndexPath时,保证单元格位于传入的indexPath处。

答案 8 :(得分:0)

为了扩展Darren的答案(我觉得最有用,感谢Darren!),你能做的就是遍历所有的超级视图'直到找到父UITableView。这应该是未来证明,因为您不依赖于固定的视图层次结构。

我使用递归方法,如果找到一个UITableView将返回UITableView,如果没有则返回nil。

- (UITableView *)parentTableViewOf:(UIView *)view {
        Class class = [view.superview class];
        NSLog(@"Class : %@", NSStringFromClass(class));

        if([view.superview isKindOfClass:[UITableView class]]) {
            return (UITableView *)view.superview;
        } else {
            return [self parentTableViewOf:view.superview];
        }

        return nil;
}

到目前为止,我已经使用了这个,它似乎没有打嗝。希望能帮助到你! :)

答案 9 :(得分:-1)

细胞不知道它们去了哪里......表格视图中有单元格,你就是告诉表格查看单元格中的内容。您可以在实现cellForRowAtIndexPath的DataSource中执行此操作...其工作方式:

索引路径有一行和一部分

对于分组表视图

一个部分属于一个组,一行属于该部分中的一个条目, UITableView知道一个部分中有多少行的方式以及有多少部分是DataSources方法numberOfSectionInTableView和方法numberOfRowsInSection,这将对cellForRowAtIndexPath进行正确调用,由你来识别正在查询哪个部分和行并且您需要根据这些规范构建您的单元格。

这是一个很好的方法,你可以使用一个包含剖面名称和NSArray值的字典,其中包含该部分的值。

所以numberOfSectionsInRows的实现看起来像

return [[dictionary allKeys] count]

numberOfRowsInSection的实现看起来像

NSString* key=[[dictionary allKeys] objectAtIndex:sectionNumber]
  return [[dictionary objectForKey:key] count]

您始终可以参考http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/TableView_iPhone/Introduction/Introduction.html处的UITableView编程指南 希望有所帮助

答案 10 :(得分:-2)

只需将属性添加到自定义UITableViewCell(取决于实现)类,该类包含int,NSNumber或NSIndexPath,指定它是哪一个。在您使用数据结构时,请将其放在该数据结构中的元素中。然后你只需在创建数据结构时设置属性,例如elt.id = i,然后在cellForRowAtIndexPath中访问它,类似if(elt.id == 0 || elt.id == n-1) )其中n是您节中的行数。

我可能完全错过了你的问题,但如果我这样做,只需发表评论,我会再次发帖。