我很难找到点击的行数。我发现的是
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
但是我得到了一个疯狂的数字。我有UITableView
,显示包含4个项目的数组。
我也试过这个:
NSIndexPath *leo = [self.tableView indexPathForSelectedRow];
NSInteger *leo2 = leo.row;
但是leo2
始终是0.我该怎么办?
答案 0 :(得分:4)
你有两个部分,你只需要把它们放在一起。这是你在找什么?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger leo2 = indexPath.row;
id someObject = myArray[leo2];
}
正如@nkongara指出的那样,你在指针名称旁边添加了一个星号,暗示它是一个Objective C对象,当它是一个原始类型时。在这种情况下,long
或int
取决于系统。有关详细信息,请参阅下面定义NSInteger
和NSUInteger
的方式。
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
答案 1 :(得分:1)
您编写的代码应该为您提供编译器警告。
一个好的经验法则:找到每个编译器警告的修复程序,没有例外。他们总是表明存在错误。有时某些东西会导致错误的结果而不是崩溃,但是编译器警告总是有原因。
有关警告的最糟糕的事情之一是它们仅在您编辑源文件时显示。如果忽略它们,编译器会将文件视为已成功编译,因此除非您编辑文件或在项目上运行“干净”,否则不会再次看到警告。这意味着如果您没有修复警告,它就会变得不可见。坏。非常糟糕。
有时修复是类型转换,因此编译器知道对象的类型。其他时候,如上所述,答案是摆脱虚假的星号。
另一个应该更改的代码示例,以消除警告:
我们都写了if语句
if (a == b)
(表示“如果a等于b”)
as
if (a = b)
而是偶然的。第二个声明在技术上是合法的,但几乎总是错误的。这意味着:将=语句的右侧复制到左侧(将a设置为b的值)。然后将右侧的结果作为if语句的结果进行评估。因此,如果b不等于零,则if语句将为真。
LLVM编译器标记if (a = b)
并发出警告,因为这是一个常见的错误。如果您确实想要这样做,可以添加一组额外的括号:
if ((a = 0))
告诉编译器你真的想要这样做。 (我说任何人都应该开枪,但这是一个不同的问题......)
这是一个修改代码的例子,可以让你的意图清晰,无论是编译器还是阅读代码的其他人。