Ios UITableView单元格选择仅在设置断点时才能正常工作

Ios UITableView单元格选择仅在设置断点时才能正常工作,ios,uitableview,Ios,Uitableview,我需要添加一个字符串,然后选择added row,保留之前所做的所有选择 由于架构问题,我必须调用刷新选择,它首先取消选择,然后再选择两次 事实上,在添加一行后,所有选择都会闪烁,并且仅选择添加的行。如果我添加另一行,所有旧选择将再次闪烁,保留选中的新行 但是如果我在第一次refreshSelections之后的任何地方设置断点,它都可以正常工作 我认为这是一个并发问题,但我不知道如何解决它 // This is called -(void)addString:(NSString *)text

我需要添加一个字符串,然后选择added row,保留之前所做的所有选择

由于架构问题,我必须调用
刷新选择
,它首先取消选择,然后再选择两次

事实上,在添加一行后,所有选择都会闪烁,并且仅选择添加的行。如果我添加另一行,所有旧选择将再次闪烁,保留选中的新行

但是如果我在第一次
refreshSelections
之后的任何地方设置断点,它都可以正常工作

我认为这是一个并发问题,但我不知道如何解决它

// This is called
-(void)addString:(NSString *)text
{
    stringsList = [stringsList arrayByAddingObject:text];
    [self applyFilter:self.searchBar.text];
    // Any breakpoint after will help
    [filterSelect addStringToSelected:text];
}

- (void)applyFilter:(NSString *)filterString
{
    [filterSelect reloadData:YES];
}

- (void)refreshSelections
{
    for (NSUInteger row = 0; row < stringsList.count; ++row) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:row inSection:0];
        [stringsTableView deselectRowAtIndexPath:indexPath animated:NO];
    }

    NSIndexSet *selectedIndexes = [stringsList indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        return [selectedStrings containsObject:obj];
    }];

    [selectedIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        [stringsTableView selectRowAtIndexPath:[NSIndexPath indexPathForItem:idx inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
    }];
}

- (void)reloadData:(BOOL)saveOrder
{
    stringsList = [self.dataSource stringsToDisplayInMultipleStringsSelect:self];

    [stringsTableView reloadData];
    [self refreshSelections];
}

- (void)addStringToSelected:(NSString *)string
{
    [self storeSelectedString:string];
    [self refreshSelections:1];
}
//这被称为
-(void)addString:(NSString*)文本
{
stringsList=[stringsList arrayByAddingObject:text];
[self-applyFilter:self.searchBar.text];
//之后的任何断点都会有所帮助
[过滤器选择addStringToSelected:text];
}
-(void)applyFilter:(NSString*)filterString
{
[过滤器选择重新加载数据:是];
}
-(无效)刷新选择
{
对于(整数行=0;行

我的所有问题。

在调用注释下的函数以首先更新UI之前,可以通过添加0.1s延迟来解决

-(void)addCustomStringControllerDelegate:(AddCustomStringController*)发送方未完成文本:(NSString*)文本
{
如果(文本长度){
stringsList=[stringsList arrayByAddingObject:text];
[self-applyFilter:self.searchBar.text];
双延迟频率=0.1;
dispatch_time_t popTime=dispatch_time(dispatch_time_NOW,(int64_t)(DelayUnseconds*NSEC_PER_SEC));
调度\u after(popTime,调度\u get\u main\u queue(),^(void){
[过滤器选择addStringToSelected:text];
});
[selectedValuesTableView重新加载数据];
}
}
但我认为,取消选择所有行,然后选择需要的行是不正确的。因此,我选择了只(取消)选择应该选择的行的方法

-(无效)刷新选择
{
NSArray*selectedBefore=stringsTableView.IndExpathForSelectedRows;
NSIndexSet*toSelect=[stringsList indexesOfObjectsPassingTest:^BOOL(id obj,NSU整数idx,BOOL*stop){
返回[所选字符串包含对象:obj];
}];
NSMUTABLEARRY*toDeselect=[NSMUTABLEARRY new];
for(NSIndexPath*在selectedBefore中选择){
如果(![ToSelectContainsIndex:selected.row]){
[要取消选择添加对象:已选择];
}
}
for(NSIndexPath*在toDeselect中取消选择){
[stringsTableView取消选择动画路径:取消选择动画:否];
}
[选择EnumerateIndexUsingBlock:^(整数idx,布尔*停止){
[stringsTableView SelectRowatineXpath:[NSIndexPath indexPathForItem:idx片段:0]动画:无滚动位置:UITableViewScrollPositionNone];
}];
}