在willDisplayCell中将UITableViewCell设置为YES:并且不能再取消选择单元格

时间:2013-09-07 18:45:26

标签: ios objective-c uitableview

我想在多选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 个答案:

答案 0 :(得分:9)

除了将单元格设置为选中之外,还需要通知tableView已选择单元格。在[{1}}方法中添加对-tableView:selectRowAtIndexPath:animated:scrollPosition:的通话:您可以正常取消选择。

willDisplayCell:

这类似于@Ivan Loya的解决方案,但可以使用您已经使用的相同方法完成。请务必使用- (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]; } } 以避免奇怪的滚动行为。

答案 1 :(得分: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函数

中注释该行

答案 2 :(得分:2)

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

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

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

    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];

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

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


        }else
        {
            newCell.accessoryType = UITableViewCellAccessoryNone;
            person.isMatch = [NSNumber numberWithBool:NO];
            self.countChecked -- ;
        }
}

答案 3 :(得分:0)

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

画了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)
    }
}