NSIndexPath 不将项目、部分或行识别为属性

Posted

技术标签:

【中文标题】NSIndexPath 不将项目、部分或行识别为属性【英文标题】:NSIndexPath does not recognize item, section, or row as properties 【发布时间】:2014-07-08 01:55:56 【问题描述】:

ios 7.1 发送我的 viewController 时:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
    cellForItemAtIndexPath:(NSIndexPath *)indexPath

indexPath 对象无法识别以下属性:item、section 或 row。预期值为 section = 0, item = 0

调试器显示:

**indexPath NSIndexPath *   0xc000000000000016

 NSObject       
_indexes    NSUInteger *    NULL    
  *_indexes     
_length     
_reserved   void *  NULL

日志报告:

(lldb) po indexPath
<NSIndexPath: 0xc000000000000016> length = 2, path = 0 - 0
(lldb) po indexPath.item
error: property 'item' not found on object of type 'NSIndexPath *'
error: 1 errors parsing expression
(lldb) po indexPath.row
error: property 'row' not found on object of type 'NSIndexPath *'
error: 1 errors parsing expression
(lldb) po indexPath.section
error: property 'section' not found on object of type 'NSIndexPath *'
error: 1 errors parsing expression****

任何想法为什么会发生这种情况以及如何处理?

【问题讨论】:

您能添加您的代码吗?很难看出真正发生了什么 这是代码。我的意思是我显示的结果是在输入方法之后立即显示的。没有其他事情发生。也许我不明白这个问题。 您只输入方法名称 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 没有其余代码。我认为有一些错误。无论如何,请检查您是否将标识符放入您的单元格。我已经构建了一些 collectionView 和 tableview 并没有遇到这个问题。 【参考方案1】:

不要使用getter/setter点语法,使用方括号

    po (int)[index row] po (int)[index section]

请注意,(int) 是将行/节打印为整数而不是十六进制所必需的。其他对 LLDB 有用的格式化参数可以在here 找到。

编辑

Foundation 框架的 Swift 覆盖提供了 IndexPath 结构,它连接到 NSIndexPath 类。 IndexPath 值类型提供与 NSIndexPath 引用类型相同的功能,并且两者可以在与 Objective-C API 交互的 Swift 代码中互换使用。这种行为类似于 Swift 如何将标准字符串、数字和集合类型桥接到它们相应的 Foundation 类。

    po index.row po index.section

按预期工作。 ppo 的评论仍然有效。

值得注意的是,您可以在 Swift 中使用 IndexPath 而不是 NSIndexPath,如 Apple Documentation 中所述。

【讨论】:

谢谢哥特式开发者。问题出在其他地方。我不知道为什么 Log 显示出如此奇怪的结果。根据您的建议,这个问题对我来说变得更清楚了。 检查!好奇,是什么? 我使用 section 和 item 来引用数组数组,但第二个“数组”实际上是一个对象,其属性是我试图访问的数组。我没有将属性引用添加到项目对象,搞砸了。 没关系。您将 po 用于整数而不是对象的项目。结果预计为零。【参考方案2】:

你可以试试这个,它非常适合我:

po (int)[indexPath row]

【讨论】:

【参考方案3】:

你为什么用po? NSIndexPath 的结果 rowsectionNSUIntegerslong ints,而不是对象。

p 表示打印,po 表示 打印对象

`NSIndexPath 一个对象。它的内容不是。

使用 p,而不是 po。

p [indexPath section]

p [indexPath row]

p indexPath.section

p indexPath.row

我总是犯同样的错误。


注意:如果使用 UIViewController 并将其扩展为具有 UITableViewController 委托和数据源,请确保将 UITableView.hUIKit 导入头文件。

该文件为 NSIndexPath 添加扩展名,以便您可以使用行和节。如果你不导入声明它们的文件,你会想知道为什么indexpath.rowindexpath.section 不起作用。

如果您想在 UITableViewController 之外访问 rowsectionNSIndexPath,则需要执行这些导入才能访问这些扩展。

【讨论】:

从使用 p 代替 po -> 错误:没有已知的方法 '-section';将消息发送到方法的返回类型 error: 1 errors parsing expression 奇数。 NSIndexPath 可能没有用于行和节的 UITableView 便捷方法。你是在哪个 UITableView 方法中得到这个的? 我在 cellforrow 委托中得到了相同的结果。 @AlexZavatone:我的理解是,对于ppo 而言,最终结果并不重要,而是你如何到达那里的本质。 p 打印局部和全局变量,而 po 打印 ObjC 对象的描述。 p 实际上是一个较低级别的命令,更接近处理器,而po 向对象发送-description 消息。他们都应该工作。 对其工作原理的有趣见解。这应该很容易测试。谢谢。

以上是关于NSIndexPath 不将项目、部分或行识别为属性的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sed 不将 \t 识别为制表符?

Go 不将 func 识别为有效接口

NSIndexPath 中是不是存在节

Java 如何在 dynamodb 中存储 JSON 对象或 JSON 数组而不将其转换为字符串?

如何访问 NSIndexPath 部分值?

是否有可能使用 .insetGrouped 样式删除表格视图中特定部分或行的插图?