需要解释(UITableView、NSMutableSet)

需要解释(UITableView、NSMutableSet),uitableview,nsmutableset,Uitableview,Nsmutableset,重新绘制单元格后,我希望筛选选定的单元格 问题是为什么我只在日志中看到这一点: 存在1 存在2 出口在哪里 简单测试: -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.selectedRows containsObject:indexPath]){ [self.selectedRows removeObject:in

重新绘制单元格后,我希望筛选选定的单元格

问题是为什么我只在日志中看到这一点: 存在1 存在2

出口在哪里

简单测试:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.selectedRows containsObject:indexPath]){
        [self.selectedRows removeObject:indexPath];
    }else{
        [self.selectedRows removeAllObjects];//test 1 item only
        [self.selectedRows addObject:indexPath];
    }
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}



-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
     NSLog(@"heightForRowAtIndexPath %@ \nSelected %@", indexPath,self.selectedRows);
    for (NSIndexPath*item in self.selectedRows) {
        if ([item compare:indexPath]==NSOrderedSame) {
            NSLog(@"EXIST1");
        }        
        if (item.section == indexPath.section && item.row == indexPath.row) {
            NSLog(@"EXIST2");
        }
    }

    if ([self.selectedRows containsObject:indexPath] == YES) {
        NSLog(@"EXIST3");
    }

    return 44.0f;
}
结果

NSMutableSet*s =[NSMutableSet new];

NSIndexPath*p1 = [NSIndexPath indexPathForRow:1 inSection:1];
NSIndexPath*p2 = [NSIndexPath indexPathForRow:1 inSection:1];

NSComparisonResult r1= [p1 compare:p2];

NSLog(@"p1 compare p2 = %@", r1==NSOrderedSame?@"YES":@"NO" );

[s addObject:p1];

NSLog(@"contain p1 =%@", [s containsObject:p1]==YES?@"YES":@"NO" );
NSLog(@"contain p2 =%@", [s containsObject:p2]==YES?@"YES":@"NO" );
NSLog(@"s = %@",s);
2014-01-08 04:42:57.477测试[28342:70b]p1比较p2=YES
2014-01-08 04:42:57.478测试[28342:70b]包含p1=是
2014-01-08 04:42:57.478测试[28342:70b]包含p2=是
2014-01-08 04:42:57.479测试[28342:70b]s={(
{length=2,path=1-1}
)}

小型NSIndexPath类别修复程序

2014-01-08 04:42:57.477 test[28342:70b] p1 compare p2 = YES
2014-01-08 04:42:57.478 test[28342:70b] contain p1 =YES
2014-01-08 04:42:57.478 test[28342:70b] contain p2 =YES
2014-01-08 04:42:57.479 test[28342:70b] s = {(
    <NSIndexPath: 0x8b2e0d0> {length = 2, path = 1 - 1}
)}
@接口nsindepath(扩展)
-(整数)散列;
@结束
@实现nsindepath(扩展)
-(整数)散列{
char-str[11];
int行=self.row;
int section=self.section;
sprintf(str,“%d%d”,节,行);
无符号int val=0;
char*p;
int i;
p=str;
对于(i=0;p[i];i++){
如果(i==0){

val=(unsigned char)p[i]我也遇到了同样的问题,我通过过滤集合解决了这个问题。我不确定哪一个更有效,但这对于我来说已经足够了。 代码来自对heightForRowAtIndexPath的调用

@interface NSIndexPath (Extended)
-(NSUInteger)hash;
@end


@implementation NSIndexPath (Extended)
-(NSUInteger)hash{
    char str[11];
    int row = self.row;
    int section = self.section;
    sprintf(str, "%d%d", section,row);

    unsigned int val = 0;
    char *p;
    int i;
    p = str;
    for(i = 0; p[ i ]; i++){
        if (i ==0) {
            val = (unsigned char)p[i] << CHAR_BIT;
        }
        else
            val |= (unsigned char)p[i];
    }
    return val;
}
@end

我认为-containsObject和-compare之间的区别在于-containsObject:查找完全相同的对象,然后-compare比较对象的内容。因为在您的例子中,对象的内容是相同的,但不是对象本身。在本例中,在测试中[s containsObject:p2]应该返回NONo,因为在您的测试用例中,编译器会优化您的代码并将p1和p2设置为同一个对象,因为它们都是静态分配给相同的值。
2014-01-08 04:42:57.477 test[28342:70b] p1 compare p2 = YES
2014-01-08 04:42:57.478 test[28342:70b] contain p1 =YES
2014-01-08 04:42:57.478 test[28342:70b] contain p2 =YES
2014-01-08 04:42:57.479 test[28342:70b] s = {(
    <NSIndexPath: 0x8b2e0d0> {length = 2, path = 1 - 1}
)}
@interface NSIndexPath (Extended)
-(NSUInteger)hash;
@end


@implementation NSIndexPath (Extended)
-(NSUInteger)hash{
    char str[11];
    int row = self.row;
    int section = self.section;
    sprintf(str, "%d%d", section,row);

    unsigned int val = 0;
    char *p;
    int i;
    p = str;
    for(i = 0; p[ i ]; i++){
        if (i ==0) {
            val = (unsigned char)p[i] << CHAR_BIT;
        }
        else
            val |= (unsigned char)p[i];
    }
    return val;
}
@end
NSSet * set = [self.hiddenPaths filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"section == %u AND row == %u",indexPath.section, indexPath.row]];

if (![set count])
{
  return 0.0f;//cell at indexPath is hidden
}