多个动态原型单元的索引路径

Posted

技术标签:

【中文标题】多个动态原型单元的索引路径【英文标题】:Index path for Multiple Dynamic prototype cells 【发布时间】:2013-02-08 02:17:00 【问题描述】:

男士们,

我需要一些帮助。这几乎就像我知道我在尝试做什么,但是在编写代码时我一直无法让它工作。场景是我有一个视图控制器,里面有一个表视图。我的表格视图有三种不同的动态原型,因为我有三种不同的单元格。现在,我要做的就是指定在哪一行中生成哪个原型单元格。我还在情节提要中为每个原​​型单元格提供了唯一标识符。

我的理解方式是我的 cellforRowatIndexpath 方法需要了解在该行中显示哪种单元格,然后选择标识符,出列并根据需要设置内容。

相应地,这是我正在尝试做的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   * )indexPath

    if(indexPath.row==0)
    
        static NSString *CellIdentifier = @"HelloCell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault      reuseIdentifier:CellIdentifier];
        

        // configure your cell here...

        return cell;
    


不幸的是,事情没有按计划进行,我的应用程序崩溃了 2013-02-07 16:47:39.859 ProjectsABC30068:c07] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSIndexPath setTableViewStyle:]:无法识别的选择器发送到实例 0x83812e0”错误.

表格视图本身没有问题,因为我已经正确设置了数据源和委托。并且还为表格视图做了一个出口。

我还尝试将 cellforRowAtIndexPath 中的 if 语句更改为 if(myTable.indexPathForSelectedRow==0)。这会在所有单元格中生成动态原型,但至少应用程序不会停止。

你们觉得问题出在哪里?

我不知道如何正确使用索引路径,如果有人可以帮助我,我将不胜感激。

【问题讨论】:

你在哪里打电话:setTableViewStyle?或者你在哪里崩溃(你可以设置一个异常断点找出来) 等等,什么是异常断点,如何设置? 【参考方案1】:

使用 Storyboard 和动态原型单元格,您不必担心或检查 dequeueReusableCellWithIdentifier: 是否返回零单元格。

你必须做什么:

对于每一行,确定正确的单元格标识符并将其提供给dequeueReusableCellWithIdentifier: 对于每个动态原型单元格,确保设置正确的标识符(选择情节提要上的每个单元格,然后在属性检查器中的表格视图单元格部分填充标识符)

让我们举个例子。假设您有三个原型单元格,标识符分别为“Cell1”、“Cell2”和“Cell3”。并假设您有三行,每行显示一个原型单元格。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return 3;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSString *identifier = [NSString stringWithFormat:@"Cell%d", indexPath.row + 1];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];

    cell.textLabel.text = identifier; // just show the identifier as title
    return cell;

【讨论】:

【参考方案2】:

你说它是报告:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSIndexPath setTableViewStyle:]:无法识别的选择器发送到实例 0x83812e0

cellForRowAtIndexPath 没有返回有效的UITableViewCell 时,您会得到这个。

你从tableView:numberOfRowsInSection: 返回了什么值?我问的原因是您的 cellForRowAtIndexPath 除了第一行之外的任何行都会失败。如果您的 tableView:numberOfRowsInSection: 指示的值大于 1,那么您的应用将崩溃。

要确认这一点,您可能需要检查 indexPath 在您的 cellForRowAtIndexPath 的开头是什么,方法是在方法的开头添加以下行:

NSLog(@"%s: section = %d; row = %d", __FUNCTION__, indexPath.section, indexPath.row);

这样您就可以确定您正在尝试为哪些行生成单元格并且您正在正确处理它。

后来你说:

我还尝试将 cellforRowAtIndexPath 中的 if 语句更改为 if(myTable.indexPathForSelectedRow==0)。这会在所有单元格中生成动态原型,但至少应用程序不会停止。

这绝对行不通,这意味着混淆了cellForRowAtIndexPath 的工作原理。它与当前选定的单元格无关。你回复numberOfSectionsInTableViewtableView:numberOfRowsInSection:,告诉它你可以创建哪些单元格,然后ios 将重复调用cellForRowAtIndexPath,它确定在给定节数和行数的情况下可能可见的每个单元格。

确保您的numberOfSectionsInTableViewtableView:numberOfRowsInSection: 方法仅返回您在cellForRowAtIndexPath 中正确处理的值。


为了进一步阅读,我建议你阅读Table View Programming Guide for iOS 或谷歌“UITableView 教程”。

【讨论】:

这是我使用 NS Log 语句得到的结果:tableView:cellForRowAtIndexPath:]: section = 0; row = 0 实际上,我现在没有收到错误,应用程序只是暂停,我收到一条消息说 Thread 1:EXC_BAD_ACCESS(code=1, address=0x310cc493) 并且在左侧窗格中,选择了 Thread 1 0 obc_autorelease @DavidWest 此错误消息和原始错误消息只是完全相同问题的不同表现形式。您没有从 cellForRowAtIndexPath 返回有效的 UITableViewCell。为cell 加上NSLog,我打赌你会看到它是nil。当您将cellForRowAtIndexPath 粘贴到此处时,您是否更改了它,因为您在此处列出的内容显然无效(HelloCell 之后没有结束引号)。我想确保我们看到的是真实的东西。此外,请确保您在 IB 中的单元格的“标识符”是 HelloCell 引用只是一个错字。标识符是正确的。这是代码,我目前有: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath if(settingsTable.indexPathForSelectedRow==0) static NSString *CellIdentifier = @"HelloCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];返回单元格; @DavidWest 这没有任何意义。首先,如果你有一个具有正确标识符的原型,dequeue 方法永远不应该是nil。其次,即使您有拼写错误(例如,大小写错误等),您也要检查 nil 并在失败时创建一个。这就是为什么我想知道numberOfRowsForSection 是否可能没有返回 1,因为indexPath.row > 0 是我想象的唯一导致您描述的问题的路径。在这一点上我只能建议你把你的项目压缩成一个 zip 文件,然后上传到某个地方供我们查看。【参考方案3】:

(这个评论有点长,所以我把它放在这里,即使它没有直接回答问题)

异常断点: 转到断点导航器

导航器底部有“+”按钮

然后它将添加一个断点供您自定义,只需单击完成即可。

现在,当抛出异常时,您将被带到触发异常的行。最重要的是,您将能够看到那一刻的整个调用堆栈。对调试非常有用。

自 4.2 以来,Xcode 中的断点可以完成更多“时髦”的事情(不确定具体时间)

【讨论】:

以上是关于多个动态原型单元的索引路径的主要内容,如果未能解决你的问题,请参考以下文章

无法获取 UITableViewCell 的索引路径

UICollectionView:页面控件的当前索引路径

是否可以快速显示表格视图单元格索引路径和集合视图索引路径?

如何在集合视图中查找最后一个可见单元格的索引路径。但索引路径是随机的不断变化

在给定的索引路径访问 UICollectionView 单元格

单元格变量为 nil,其中设置了值 collectionview 索引路径