4

我想在多选 UITableView 中预先选择一些行。

tableView:willDisplayCell:forRowAtIndexPath:通过简单地设置来做到这一点[cell setSelected:YES animated:NO];

但是,由于某种原因,这会禁用这些行的取消选择。嵌入式控件仍然有效,细节披露按钮也是如此。

我在这里上传了一个示例项目:https ://github.com/leberwurstsaft/TableViewIssue ,您可以在其中查看行为(Viewcontroller.m第 49-51 行)。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell setSelected:NO animated:NO]; //   -->   setSelected:YES and the cells can't be deselected anymore...
}

似乎是什么问题?

4

4 回答 4

10

除了将单元格设置为选中,还需要通知tableView该单元格被选中。添加-tableView:selectRowAtIndexPath:animated:scrollPosition:对您的willDisplayCell:方法的调用:您将能够像往常一样取消选择它。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (/*should be selected */) {
        [cell setSelected:YES animated:NO]; 
        [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}

这类似于@Ivan Loya 的解决方案,但可以使用您已经使用的相同方法完成。请务必使用UITableViewScrollPositionNone以避免奇怪的滚动行为。

于 2014-08-06T16:38:12.717 回答
5

尝试这个视图确实出现了,为我工作

- (void)viewDidAppear:(BOOL)animated {
    NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0];
    [_tableView selectRowAtIndexPath:indexPath animated:YES  scrollPosition:UITableViewScrollPositionBottom];
}

在您的 viewController.h 添加并将其链接到表视图

@property (weak, nonatomic) IBOutlet UITableView *tableView;

并在 willDisplayCell 函数中注释该行

于 2013-09-07T18:58:22.637 回答
1

我认为您应该将您的选择放入- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath并在其中切换选择。

这是我在类似情况下所做的,我想在每一行上切换复选标记

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{       
    [tableView deselectRowAtIndexPath:indexPath 动画:NO];

    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];

    人 * 人 = [self.contactTable objectAtIndex:indexPath.row];

        if (newCell.accessoryType == UITableViewCellAccessoryNone)
        {
            newCell.accessoryType = UITableViewCellAccessoryCheckmark;
            person.isMatch = [NSNumber numberWithBool:YES];
            self.countChecked ++ ;


        }别的
        {
            newCell.accessoryType = UITableViewCellAccessoryNone;
            person.isMatch = [NSNumber numberWithBool:NO];
            self.countChecked -- ;
        }
}
于 2013-09-07T18:50:45.913 回答
0

对于那些在 iOS 11 中想知道如何解决此问题的人:

Drew C,说得对,但我把它翻译成 Swift:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    if cell.isSelected {
        cell.isSelected = true
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    }
}
于 2018-10-03T00:01:31.693 回答