【问题标题】:My table cells don't highlight immediately when touched触摸时我的表格单元格不会立即突出显示
【发布时间】:2009-07-10 22:21:55
【问题描述】:

在我的应用程序中,我有一个大约有八个单元格的表格视图。顶部有一个导航栏。当用户触摸一个单元格时,大约 1/2 秒内没有任何反应。然后被触摸的单元格突出显示为蓝色,新视图立即滑入到位。

问题在于,直到刚刚新视图滑入到位之前,用户才知道他触摸了哪个单元格。

例如,当我在 iPhone 的设置应用程序中浏览表格时,当你触摸一个单元格时,该单元格立即变成蓝色,然后有 1/2 秒的延迟,然后你查看新视图。

如何让我的表格立即获得高亮单元格的反馈?我用的是tableView didSelectRowAtIndexPath:,每个单元格都有一个附属按钮。

感谢您的任何见解。

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

    您是否使用自定义绘制的单元格(带有 drawRect 覆盖)或类似的东西?

    如果你有一个自定义的 drawRect 方法,你需要做这样的事情(基于 tweetie 的代码,找到 here):

    
    //default colors for cell
    UIColor *backgroundColor = [UIColor whiteColor];
    UIColor *textColor = [UIColor blackColor];
    
    //on highlight, swap colors
    if(self.highlighted){
        backgroundColor = [UIColor clearColor];
        textColor = [UIColor whiteColor];
    }
    

    这应该给你默认行为。

    【讨论】:

    • 嗨,kolywater,我根本没有使用自定义绘制的单元格。我只是将文本分配给单元格。我真的不想负责绘制整个单元格,我正在寻找单元格在被触​​摸后突出显示延迟如此之多的原因。似乎操作系统应该处理这个问题! /史蒂夫
    • 如果从 didSelectRowAtIndex 方法中删除所有内容,突出显示是否有效?您也可以发布您的 didSelectRowAtIndex 代码吗?
    • 嗨,kolywater,我正在下面的帖子中回答这个问题,因为快速评论只能允许我输入 600 个字符。
    • 遇到了同样的问题,我正在使用 ABTableViewCells。在示例中,它是 if(self.selected)。必须用 if(self.selected || self.highlighted) 替换它。谢谢!
    【解决方案2】:

    处理完新幻灯片后,听起来屏幕正在刷新。您需要在渲染新的幻灯片视图之前刷新屏幕。

    【讨论】:

    • 嗨,罗伯特,感谢您的回复。我是一个新手。如何“刷新”屏幕? /SD
    • 显然没有我想象的那么容易:thebitsource.com/2009/04/12/… 不过,它可以做到,一些例子见这个页面:bit-101.com/blog/?p=1793
    • 嗨,罗伯特,我有点卡住了。在我看来,我正在寻找的应该是单元格的默认操作。我不应该编写代码来突出显示选中的单元格,不是吗?我想知道是什么导致了这样的延迟。 /史蒂夫
    • 史蒂夫,这些家伙似乎知道他们在做什么:iphonedevsdk.com/forum/iphone-sdk-development/…。我的相关经验更多地与一般用户界面有关,而与 iPhone 本身的关系不大。
    【解决方案3】:

    一些事情:

    最好在 beforeViewController 中有一个属性,这样它就可以在加载时设置自己的标题(而不是从父类中设置)。

    第二,你为什么要为当前班级设置后退按钮?你也泄露了(你分配了 UIBarButtonItem 但不释放它)。

    
    NewViewController *newViewController = [[[NewViewController alloc]
    initWithNibName:@"New" bundle:nil] autorelease];
    newViewController.name = [self.listData objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:beforeAfterViewController animated:YES]; 
    

    然后在 NewViewController 中,你有

    
    - (void) viewDidLoad{
        self.title = self.name;
    }
    


    回复:您的第二个问题:如果您使用 [self.navigationController popViewControllerAnimated:YES] 弹出子控制器,则父视图应自动取消选择先前选择的行。除非您强迫它保持这种状态,否则它不应保持选中状态。

    你不需要做任何类似 [self.tableView deselectRowAtIndexPath:] 的事情,除非你没有推送子视图(并且做一些事情,比如勾选用户点击的单元格)。

    【讨论】:

      【解决方案4】:

      您可以将这两行代码放在 didSelectRowAtIndexPath 方法的开头:

      UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
      [cell setSelected:YES animated:YES];
      

      在处理其他程序逻辑之前,它应该首先突出显示单元格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 2011-04-12
        • 2014-02-03
        相关资源
        最近更新 更多