jjzjj

ios - 重新加载数据 VS。 reloadRowsAtIndexPaths

coder 2023-09-25 原文

我的问题如标题所示。在 iOS 7/iPhone 4 上这两种方法是有区别的。 问题是我正在以气泡聊天形式加载聊天对话。每个单元格都是一个包含文本消息、日期和消息状态(已发送、已接收、已查看或已收到)的气泡。

当我需要重新加载特定单元格时,我使用方法 reloadRowsAtIndexPaths 方法。它在 iOS 8(iPhone 4s 和 iPhone 5c)上完美运行。但是,它不适用于 iOS 7 (iPhone 4)。通过“工作”我的意思是它重新加载就可以了。但是在 iOS 7 的情况下,它只加载背景 View 而不加载文本或任何其他元素。

显然,这意味着重新加载时数据已找到(因为它在其他设备上确实有效)。我需要在 reloadRowsAtIndexPaths 之后使用 reloadData 来将整个内容加载到 iOS 7 (iPhone 4) 中。或者,我应该滚动表格 View 以加载单元格。

我确实解决了问题。但我想知道这是否是 iPhone 4 (iOS 7) 中的已知错误。

下面是一段可能有助于理解问题的代码:

- (void)tableView:(UIBubbleTableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [self.bubbleTable cellForRowAtIndexPath:indexPath];
    if ([cell isKindOfClass:[UIBubbleTableViewCell class]] && isEditing) {
        NSBubbleData * bubble;
        // fetch the corresponding bubble index in the bubble data array
        int bubbleIndex = [self getArrayIndexForIndexPath:indexPath];
        bubble = [self.bubbleData objectAtIndex:bubbleIndex];
        // making sure it's either a msg sent by me or msg sent by someone else. In other words, making sure it's neither a system message nor is it a header date or something.
        if (bubble.type != BubbleTypeMine && bubble.type != BubbleTypeSomeoneElse)
            return;

        // configure the bubble to be [de]selected
        bubble.isSelected = !bubble.isSelected;

        // add the Key-Value pair to the dictionary
        if ([selectedIndices valueForKey:bubble.msgID]) [selectedIndices removeObjectForKey:bubble.msgID];
        else [selectedIndices setValue:[NSNumber numberWithInt:bubbleIndex] forKey:bubble.msgID];

        // update gui
        [self.bubbleTable reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
        if([[self machineName] isEqualToString:@"iPhone3,1"] ||
           [[self machineName] isEqualToString:@"iPhone3,2"] ||
           [[self machineName] isEqualToString:@"iPhone3,3"]) { // iphone 4
            [self.bubbleTable reloadData];
        }
#if DEBUG
        printf("Selected Message Text: %s\n", [[[_anasDb getFromChatRoom:self.contactInternationalPhone message:bubble.msgID] valueForKey:MESSAGE_TEXT] UTF8String]);
#endif
    }
}

很明显,您不必了解所有内容。以下是代码的内容(在问题的上下文中):

  1. 获取单元格的实例。
  2. 编辑它的一些属性,使其在下次重新加载后表现不同
  3. 使用 reloadRowsAtIndexPaths 重新加载该特定单元格 - 到目前为止,它适用于所有设备,除了需要 reloadData 的 iPhone 4 (iOS 7)。

这是 cellForRowAtIndexPath 的相关部分:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UIBubbleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    NSBubbleData *data = [[self.bubbleSection objectAtIndex:indexPath.section] objectAtIndex:indexPath.row - 1];

    if (cell == nil) cell = [[UIBubbleTableViewCell alloc] init];

    cell.data = data;
    cell.showAvatar = self.showAvatars;
    if (data.isSelected) {
        cell.dim = YES;
        cell.backgroundColor = [UIColor colorWithRed:0.0 green:0.39 blue:0.106 alpha:0.2f];
    } else {
        cell.backgroundColor = [UIColor clearColor];
    }
    return cell;

提前致谢。

最佳答案

您的代码存在问题,您需要将数据加载到内部单元格中

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

- (void)tableView:(UIBubbleTableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 中调整您的数据,然后为指定的行调用 reloadRowsAtIndexPaths。不要在该方法内更改单元格标签(或者如果您不想重新加载特定行,您可以在此处更改数据和单元格内容)

重新加载数据会重新加载所有行,这在大多数情况下不是您需要的,因为它会停止滚动并重新计算高度、部分计数等

关于ios - 重新加载数据 VS。 reloadRowsAtIndexPaths,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28744074/

有关ios - 重新加载数据 VS。 reloadRowsAtIndexPaths的更多相关文章

  1. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  9. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  10. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

随机推荐