【问题标题】:UITableView Cell IndexPathUITableView 单元格索引路径
【发布时间】:2011-02-02 15:10:32
【问题描述】:

谁能告诉我如何获得单元格 IndexPath? 我将 IndexPath 保存在 tableView: cellForRowAtIndexPath: 方法中,但这仅在查看单元格时加载,我需要在 viewDidLoad 方法上知道它的索引路径。这导致了一个空值,因为正如我所说,它只在单元格被查看一次后加载它的值。

谢谢。

编辑

目的是能够跳转到具有特定编号但与节数和行数不成线性关系的特定单元格。

【问题讨论】:

  • 为什么viewDidLoad方法中需要indexPath?
  • 因为我需要跳转到我桌子上的特定单元格位置,我不知道它会在什么位置。
  • 我很困惑。表中特定数据元素的部分和行数如何不是线性的?如果不是线性的,如何显示线性表?
  • 例如,每个单元格数据都有一个与之关联的数字,从 0 到 9,但是会有 3 个部分,其中第一个部分有 3 个元素,第二个部分是 6,第三个部分是 1,总线此分布可以变化,它由单元格索引路径给出。所以我知道我的单元格将是 9 号,但我必须跳到 [2,5]。希望这能说明我的意思。谢谢。

标签: iphone objective-c uitableview nsindexpath


【解决方案1】:

在 tableView 上使用方法 indexPathForCell:,给定一个指向 UITableViewCell 的指针,它返回它的 indexPath。

如果viewDidLoad 中尚未设置scrollToRowAtIndexPath:atScrollPosition:animated:,您可以将其放入viewWillAppear 方法中。如果视图在加载后可以多次出现,例如当它调用的模态视图控制器辞职时,这是一个更好的地方。

【讨论】:

  • 问题是单元格是可重用的,并且在调用 tableView:cellForRowAtIndexPath: 之前它不可见或实例化,所以我没有对单元格的任何引用。由于我从第 5 节调用第 0 行,我正在创建 IndexPath 并在 scrollToRowAtIndexPath:atScrollPosition:animated 中使用它:我坚持使用这个丑陋的解决方案,所以如果你有更好的想法,请分享。
  • 好吧,如果你不知道要滚动到哪个单元格,也不知道要滚动到哪个索引路径(行/节),听起来你不能做。这可能不适用,但在我的情况下,我将所有单元格都放在一个 NSArray 中,所以我可以滚动到任何单元格,但我也没有重用任何单元格。
  • 感谢您的耐心等待
【解决方案2】:

UITableViewCell 没有 NSIndexPath 属性。 UITableViewDataSource 委托定义了为给定 NSIndexPath 请求单元格的方法,但这并不意味着该单元格与 NSIndexPath 属性有任何持久关系。

如果您能详细说明您想要此属性的用途,或许会有所帮助?你想对viewDidLoad中的单元格位置做什么?

【讨论】:

  • 我希望能够使用 scrollToRowAtIndexPath:atScrollPosition:animated: at 跳转到那个特定的单元格,这似乎是正确的方法。
  • 好的,然后创建一个NSIndexPath 变量,并创建一个副本供您使用,以便将来调用该方法。
  • 这就是我所拥有的。问题是该变量仅在构造单元格时才被实例化,并且如果单元格在开始时不可见,则它不会被构造并且此值为 null
  • 为什么只有在构建单元格时才实例化(实例化)indexpath变量?为什么不能在要发出 scrollTo 的视图控制器中实例化它?
  • 感谢您的耐心等待
【解决方案3】:

试试这个..

    NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:EventlistTable_obj];
NSIndexPath *indexPath = [EventlistTable_obj indexPathForRowAtPoint: currentTouchPosition];
 NSLog(@"Selected  row:%d in section:%d",indexPath.row,indexPath.section);

这样调用:

[cell.fourth_image_button addTarget:self action:@selector(Btn_pressed:event:) forControlEvents:UIControlEventTouchUpInside];

【讨论】:

    【解决方案4】:

    在我看来,您回答了自己的问题:您不能。因为执行 viewDidLoad 时单元格没有 indexPath。事实上,它以后也没有,因为如果您使用单元出列(好词!),那么同一个单元可以在十分之一秒内被重用到另一个索引,这是您应该的。

    编辑:好的,我想我明白了您想要什么:当您将单元格交给 tableView 时,您自己将 indexPath 保存在某个地方。注意:如果你不这样做,你就无法真正知道特定单元格放置在哪个 indexPath 上,至少如果你按照你应该的方式做事的话。

    因此,您只需在 viewDidLoad 方法中创建所有单元格,将它们存储在一个数组中,然后,当表格视图请求它们时,只需从该数组中传递它们即可。

    请注意,这不是填充表格视图的好方法,因为它会阻止单元格被重用。更好的方法是将单元格(普通 UIViews)的 contents 保存在数组中,并在返回单元格之前将它们作为子级添加到单元格的内容视图中。这将允许细胞重复使用,这对于良好的性能至关重要。如果您的单元格不超过屏幕大小,则不必担心重复使用它们。

    【讨论】:

    • 您的部分答案不正确。在我存储特定单元格的 IndexPath 之后,我仍然可以使用它的 IndexPath,因为它在另一个地方被引用。
    • 好吧,也许你不熟悉正在发生的事情。当我存储一个单元格 IndexPath 时,即使该单元格是否被实例化,它也将始终是相同的值。它是用每个部分的行数和 e tableView:cellForRowAtIndexPath: 给我的 os 部分数计算的,当我找到我想要的特定单元格时,我只存储它们的位置,我无意存储所有单元格,因为它们太多了。也许最好的方法是向下滚动,保存所有 IP,然后在 viewDidLoad 上全部向上滚动?你觉得怎么样。谢谢。
    • @Reonarudo:“存储单元格 indexPath”是什么意思?发生的情况是表格视图要求您为该特定索引路径提供一个单元格。单元格本身没有设置任何属性,至少没有您应该访问的属性。 “当我找到我想要的特定单元格时,我只存储它们的位置”——这是什么意思?你在哪里找到它们,你想在哪里存储它们。请务必阅读并理解 -(UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 的文档,以了解为什么您所做的不是一个好主意。
    • 当我获取每个 IndexPath 的单元格内容时,我检查它是否内容编号 X,如果是,那么我想将其位置存储在当前 IndexPath 给出的表上,所有单元格内容存储在 coredata 数据库中。这样我就可以在按下按钮时自动滚动到该特定位置。也许您知道更好的方法?
    • @Reonarudo:我相信 kk6yb 的回答几乎涵盖了它。
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多