如何在当前选定的表格单元格移出屏幕后向其发送消息?

Posted

技术标签:

【中文标题】如何在当前选定的表格单元格移出屏幕后向其发送消息?【英文标题】:How can I send a message to the currently selected table cell after it has moved off-screen? 【发布时间】:2011-02-17 14:47:51 【问题描述】:

这是我的场景:

我在UINavigationController 中显示UITableViewController,我自己在子类中绘制单元格。为了使单元格看起来尽可能接近本机单元格,我有一个标志来指示它是否处于过渡状态,以防止当用户从堆栈向上移动时文本颜色明显闪烁表视图的详细视图。

目前,我在-tableView:didSelectRowAtIndexPath: 中设置了我的过渡标志,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    // (stuff for pushing the detail view on to the navigation stack)

    ((MyCustomTableViewCell *) [self.tableView cellForRowAtIndexPath: indexPath]).transitioning = YES;

这很有效,但有一个警告:在列表动画离开屏幕之前,任何寻找它的人都可以清楚地看到过渡,因为单元格文本从白色(蓝色)变为黑色(蓝色)。

我的问题:有没有办法从表格视图中获取当前选定的单元格,它已经过渡到屏幕外,并向其发送消息? (假设它没有被释放,只是卸载)

或者我只是以错误的方式处理这整件事?

(对于任何考虑说没有人会注意到它的人,请记住,它是我可以接受的,我只是想知道是否有办法让它变得更好。好的 ios 应用程序都是关于小事。)

【问题讨论】:

【参考方案1】:

“防止文本颜色明显闪烁”是什么意思?默认情况下,iOS 表格单元格似乎不会这样做,至少以一种不愉快的方式。也许你可以重新审视你的 UITableViewCell 实现并确定你是否错误地处理了 -setSelected:animated: 和 -setHighlighted:animated

【讨论】:

我正在使用 CoreGraphics 自己绘制我的单元格。如果你想使用内置的蓝色高亮颜色(顺便说一句,它实际上不是颜色,而是图像),那么使用 CG 进行绘图会导致文本颜色从白色闪烁到空白,然后又变回黑色当单元格被取消选择时,除非您在单元格取消选择动画之前将文本颜色改回黑色。【参考方案2】:

UITableView 不会保留表格中所有单元格的可公开访问的列表。 为了访问所有单元格(包括屏幕外的单元格),您需要维护您生成的单元格的单独数组。



@interface MyViewController : UIViewController 

   NSMutableArray* tableCells;




@implementation MyViewController

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

    if (tableCells == nil)
      tableCells = [[NSMutableArray alloc] init];

    UITableViewCell* cell;
    if (indexPath.row < [tableCells count])
    
        // Return a cell from the cached list
        cell = (UITableViewCell*)[tableCells objectAtIndex:indexPath.row];
    
    else
    
        // Create a new cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:@"identifier"];  

        // Customize and fill the cell with content anyway you wish
        // ...
    

    return cell;


现在您有了表格中所有单元格的列表,您可以随时向他们发送任何消息。

【讨论】:

嗯……是的。 UITableView-cellForRowAtIndexPath: 将返回对您喜欢的任何特定单元格的引用。但是,您的回答确实有一些优点,因为它建议保存对相关单元格的引用并将其传递到其他地方以发送消息。我试试看。 PS:我向 $DEITY 祈祷您从未使用过此代码。太……错了。您是否看过 Apple 的基于导航的应用程序模板,或任何使用 UITableViewController 的模板? @abrahamvegh:正如我在回复中所说,据我所知,UITableView 不会保留对表格中所有单元格的引用 - 只有可见的单元格。这就是委托 cellForRowAtIndexPath 的用途:允许您自己管理单元格(使用 dequeue 只是一种选择,而不是义务)。如果您的单元格位于可见区域之外(在文档中),则 UITableView-cellForRowAtIndexPath 将返回 nil。这支持 UITableView 不存储对所有单元格的引用的想法。 考虑到我上面的评论,解决您的问题的唯一方法(随时访问任何单元格)是将整个单元格列表存储在您的应用程序中。 UITableView 不会为你做这件事,所以你不得不这样做。 这确实有道理,但它忽略了这样一个事实,即我的问题专门询问了一个刚刚被选中的单元格,因此保证它是可见的,这保证了我至少有两个 @987654322 @-built-in 访问对它的引用的方法(-visibleCells-indexPathForSelectedRow。)我很确定我没有表示任何时候想要访问任何单元格,尽管我很欣赏为此所做的努力.

以上是关于如何在当前选定的表格单元格移出屏幕后向其发送消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何将选定的单元格发送到另一个视图控制器?

如何让一个不和谐的 js 机器人在某人获得某个角色后向他发送消息

可以在 PostgreSQL 表创建后向其添加 UNIQUE 约束吗?

如何在另一个视图控制器上向 UInavigationcontroller 显示完整的选定表格单元格

电子表格中保存的快捷键 电子表格中如何保存的快捷键

显示当前时间