无法将注释数据传递给tableviewcontroller

时间:2012-08-24 18:38:56

标签: ios uitableview mkannotation

编辑问题:

我正在尝试在地图视图中创建注释(带标题/副标题),并将我地图上的所有注释推送到显示带有标题/副标题的列表的tableview。

我有一个RegionAnnotation.h / .m NSObject文件,用于填充我在MapViewController上填充引脚所需的反向地理编码。这很好用。我做一个长按,创建一个图钉,标题和副标题显示,反向地理编码工作。

现在我想将引脚数据推送到tableview列表。我已尝试在cellForRowAtIndexPath中调用区域注释信息,并使用UITableViewCellStyleSubtitle以获取正确的格式以填充标题和副标题。但是,当我打电话给以下人员时:

if (cell == nil){
    NSLog(@"if cell");
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }

CLPlacemark *pins = [self.annotations objectAtIndex:indexPath.row];
RegionAnnotation *annotation = [[RegionAnnotation alloc] initWithLocationIdentifier:(NSString *)pins];
cell.textLabel.text = annotation.title;

我只获得标题,这种情况是“位置提醒”,但是,作为地址的字幕信息不会填充表格。所有显示的都是文字“副标题”。

如何使用标题信息和子信息填充单元格。我已经研究了一个多月了,似乎无法找到解决方案。请帮忙。

1 个答案:

答案 0 :(得分:0)

对最新发布的代码发表了一些评论:

CLPlacemark *pins = [self.annotations objectAtIndex:indexPath.row];
RegionAnnotation *annotation = [[RegionAnnotation alloc] 
    initWithLocationIdentifier:(NSString *)pins];

这看起来并不正确。 pins变量被声明为CLPlacemark(由于CLPlacemark不符合MKAnnotation,因此本身是可疑的,所以为什么它在"注释"数组?)然后它被转换为NSString *,它与CLPlacemark无关。演员表不会将pins转换为字符串 - 它会将pins指向的数据视为NSString(它不是&#39} ; t)的

以前的代码也有太多其他问题,问题和未知因素。

<小时/> 相反,我将举例说明如何将地图视图上的注释传递给表格视图并在单元格中显示数据......

  • PinListViewController(具有表视图的那个)中,我们声明了一个NSArray属性来接收和引用注释:

    //in the .h:
    //Don't bother declaring an ivar with the same name.
    @property (nonatomic, retain) NSArray *annotations;
    //in the .m:
    @synthesize annotations;
    
  • 接下来,在MapViewController中,在您要呈现/推送/显示PinListViewController的位置,代码将是这样的:

    PinListViewController *plvc = [[PinListViewController alloc] init...
    
    //pass the map view's annotations array...
    plvc.annotations = mapView.annotations;
    
    [self presentModalViewController:plvc animated:YES];  //or push, etc.
    
    [plvc release];  //remove if using ARC
    

    这里重要的一点是,此示例发送整个注释数组。如果您使用showsUserLocation = YES显示用户的当前位置,则阵列也将包含该注释。如果您只想发送某些注释,则必须首先从地图视图数组中构建一个包含所需数组的新数组,并将plvc.annotations设置为等于该新数组。一种简单的方法是遍历mapView.annotations,如果注释是您想要包含的注释,则使用addObject将其添加到新数组中。直接使用地图视图annotations数组的另一个可能问题是,如果地图上的注释更改(添加/删除),而表视图仍显示注释列表,它将不同步,可能会导致运行时范围异常。为避免这种情况,如有必要,您可以将plvc.annotations设置为地图视图注释数组的副本(即[mapView.annotations copy])。

  • PinListViewController中,numberOfRowsInSection方法:

    return self.annotations.count;
    
  • PinListViewController中,cellForRowAtIndexPath方法:

    //typical dequeue/alloc+init stuff here...
    //assume cell style is set to UITableViewCellStyleSubtitle
    
    id<MKAnnotation> annotation = [self.annotations objectAtIndex:indexPath.row];
    cell.textLabel.text = annotation.title;
    cell.detailTextLabel.text = annotation.subtitle;
    
    return cell;
    

    annotation被声明为id<MKAnnotation>,因此它适用于任何类型的注释,因为该示例只需要显示标准的titlesubtitle属性。如果您需要在自定义注记类中显示自定义属性,则可以使用isKindOfClass检查annotation是否属于该类型,然后可以将其强制转换为该自定义类并引用自定义属性。