我想在多选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...
}
什么似乎是问题?
答案 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)
}
}