奇怪的行为 - 行不会重新选择,直到三个水龙头

Posted

技术标签:

【中文标题】奇怪的行为 - 行不会重新选择,直到三个水龙头【英文标题】:Strange behavior - Row won't reselect until three taps 【发布时间】:2014-12-23 03:13:22 【问题描述】:

我目前在 ios 中遇到了一个 UITableView 的奇怪问题,即取消选择的行不再可以立即选择,您必须点击三下才能再次选择。我正在实施类似于清单的东西,有一个“清除”按钮可以通过并取消选择所有单元格。此效果仅在先前已选择单元格但按下“清除”按钮时发生。如果一个单元格之前没有被触摸过,而在清除按钮之后被触摸,它将被呈现并正常切换。

这就是我所拥有的

我应该提到这个表所在的 VC 存储在一个容器内,因此是对它的引用。

取消选择

- (IBAction)btnClearTapped:(id)sender 
    UITableView *locationList = self.locationsVc.tableView;

    for (NSUInteger i = 0; i < [locationList numberOfSections]; i++) 
        for (NSUInteger j = 0; j < [locationList numberOfRowsInSection:i]; j++) 
            [locationList deselectRowAtIndexPath:[NSIndexPath indexPathForRow:j inSection:i] animated:YES];
        
    

didSelectRowAtIndexPath 方法

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    BOOL isChecked = !((NSNumber *) cellToggleDict[indexPath]).boolValue;
    cellToggleDict[indexPath] = @(isChecked);
    UIView *selectionColorView = [[UIView alloc] init];
    if (isChecked) 
        selectionColorView.backgroundColor = selectedColor;
        selectedLocations[indexPath] = [[Search sharedManager] locationAtIndexPath:indexPath];//PFObject
    
    else 
        selectionColorView.backgroundColor = unselectedColor;
        [selectedLocations removeObjectForKey:indexPath];
    
    cell.selectedBackgroundView = selectionColorView;

最后是出队和重绘方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Reuse" forIndexPath:indexPath];

    PFObject *object = [[Search sharedManager] locationAtIndexPath:indexPath];

    cell.textLabel.text = object[@"Name"];
    BOOL isChecked = ((NSNumber *) cellToggleDict[indexPath]).boolValue;

    UIView *selectionColorView = [[UIView alloc] init];
    if (isChecked) 
        selectionColorView.backgroundColor = selectedColor;
    
    else 
        selectionColorView.backgroundColor = unselectedColor;
    

    cell.selectedBackgroundView = selectionColorView;

    return cell;

【问题讨论】:

【参考方案1】:

您没有清除 btnClearTapped: 方法中的 cellToggleDict 条目。你应该有。

- (IBAction)btnClearTapped:(id)sender 
    UITableView *locationList = self.locationsVc.tableView;

    [cellToggleDict removeAllObjects];    // Clear all objects from the selected store

    for (NSUInteger i = 0; i < [locationList numberOfSections]; i++) 
        for (NSUInteger j = 0; j < [locationList numberOfRowsInSection:i]; j++) 
            [locationList deselectRowAtIndexPath:[NSIndexPath indexPathForRow:j inSection:i] animated:YES];
        
    

【讨论】:

您能否在答案中添加更多细节?虽然简短的回答可能有助于指出正确的方向,但进一步解释会有所帮助。 就是这样。谢谢保罗。也有道理。如果我真的要清除它,我会清除所有东西。您能否详细说明为什么它有时会起作用而其他时候不起作用? 我的猜测是这取决于在您清除所有之前选择了哪些行以及之后您用来测试哪些行。顺便说一句,您可以使用 NSIndexSet 而不是字典来存储检查状态

以上是关于奇怪的行为 - 行不会重新选择,直到三个水龙头的主要内容,如果未能解决你的问题,请参考以下文章

真的很奇怪的drawRect行为??

Linux上的pthread条件变量,奇怪的行为

核心数据:NSManagedObjectContext 未保存/获取请求失败,直到应用退出和重新启动

选择行后Tableview不会重新加载数据

奇怪的 QTableWidget 行为 - 并非所有单元格在排序后填充,然后重新填充

UIScrollView:内部视图不合适,奇怪的行为,视图在触摸时重新恢复