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
按预期工作。 p
与 po
的评论仍然有效。
值得注意的是,您可以在 Swift 中使用 IndexPath
而不是 NSIndexPath,如 Apple Documentation 中所述。
【讨论】:
谢谢哥特式开发者。问题出在其他地方。我不知道为什么 Log 显示出如此奇怪的结果。根据您的建议,这个问题对我来说变得更清楚了。 检查!好奇,是什么? 我使用 section 和 item 来引用数组数组,但第二个“数组”实际上是一个对象,其属性是我试图访问的数组。我没有将属性引用添加到项目对象,搞砸了。 没关系。您将 po 用于整数而不是对象的项目。结果预计为零。【参考方案2】:你可以试试这个,它非常适合我:
po (int)[indexPath row]
【讨论】:
【参考方案3】:你为什么用po? NSIndexPath 的结果 row
和 section
是 NSUIntegers
或 long
ints
,而不是对象。
p 表示打印,po 表示 打印对象。
`NSIndexPath 是一个对象。它的内容不是。
使用 p,而不是 po。
p [indexPath section]
p [indexPath row]
p indexPath.section
p indexPath.row
我总是犯同样的错误。
注意:如果使用 UIViewController
并将其扩展为具有 UITableViewController 委托和数据源,请确保将 UITableView.h
或 UIKit
导入头文件。
该文件为 NSIndexPath 添加扩展名,以便您可以使用行和节。如果你不导入声明它们的文件,你会想知道为什么indexpath.row
和indexpath.section
不起作用。
如果您想在 UITableViewController
之外访问 row
和 section
或 NSIndexPath
,则需要执行这些导入才能访问这些扩展。
【讨论】:
从使用 p 代替 po -> 错误:没有已知的方法 '-section';将消息发送到方法的返回类型 error: 1 errors parsing expression 奇数。 NSIndexPath 可能没有用于行和节的 UITableView 便捷方法。你是在哪个 UITableView 方法中得到这个的? 我在 cellforrow 委托中得到了相同的结果。 @AlexZavatone:我的理解是,对于p
与po
而言,最终结果并不重要,而是你如何到达那里的本质。 p 打印局部和全局变量,而 po 打印 ObjC 对象的描述。 p
实际上是一个较低级别的命令,更接近处理器,而po
向对象发送-description
消息。他们都应该工作。
对其工作原理的有趣见解。这应该很容易测试。谢谢。以上是关于NSIndexPath 不将项目、部分或行识别为属性的主要内容,如果未能解决你的问题,请参考以下文章