【问题标题】:How to store data with id keys which are not NSCopying如何使用不是 NSCopying 的 id 键存储数据
【发布时间】:2016-05-20 10:50:29
【问题描述】:

我需要实现一个在某种意义上模仿MKMapView 的界面。具体来说,我需要支持方法

-(void)addAnnotation:(id<MyAnnotation>)annotation;
-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation;

在内部有一个将注解映射到UIView 对象(可能为空)的映射。

那么我应该如何存储这些注解和对应的视图呢?自然的选择是NSMutableDictionary:

@property(nonatomic) NSMutableDictionary *m_dict;

-(void)addAnnotation:(id<MyAnnotation>)annotation {
    UIView *view = ....;
    if (view) {
        [_m_dict setObject:view forKey:annotation];
    }
    else {
        [_m_dict setObject:[NSNull null] forKey:annotation];
    }
}

-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation {
    id ret = [_m_dict objectForKey:annotation];
    if ([ret isKindOfClass:[UIView class]]) {
        return ret;
    }
    return nil;
}

但它不起作用,因为不能保证id&lt;MyAnnotation&gt; 符合NSCopying

我考虑将id&lt;MyAnnotation&gt; 保存为原始指针,然后将指针存储到NSNumber(符合NSCopying)。但我不确定这是一个好主意以及如何安全地实施它。

【问题讨论】:

标签: ios objective-c nscopying


【解决方案1】:

您可以创建一个唯一的字符串作为 keypath,并将其保存在您的注释中。

@property(nonatomic) NSMutableDictionary *m_dict;

-(void)addAnnotation:(id<MyAnnotation>)annotation {
    UIView *view = ....;
    NSString *unique_id = ....;
    [annotation setValue:unique_id forKey:@"_unique_id"];
    if (view) {
        [_m_dict setObject:view forKey:unique_id];
    }
    else {
        [_m_dict setObject:[NSNull null] forKey:unique_id];
    }
}

-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation {
    id ret = [_m_dict objectForKey:annotation valueForKey:@"_unique_id"];
    if ([ret isKindOfClass:[UIView class]]) {
        return ret;
    }
    return nil;
}

【讨论】:

  • MyAnnotation 是一个协议,而不是一个接口。我无法向其中添加文件。
  • 使用 KVC 而不是属性。
猜你喜欢
  • 2011-12-12
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多