1

编辑问题:

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

我有一个 RegionAnnotation.h/.m NSObject 文件,它可以进行反向地理编码,我需要填充 MapViewController 上的引脚。这工作得很好。我做了一个长按创建一个图钉和标题和副标题显示和反向地理编码工作。

现在我想将 pin 数据推送到 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;

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

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

4

1 回答 1

0

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

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

这看起来不对。该pins变量被声明为 a CLPlacemark(这本身很可疑,因为CLPlacemark不符合MKAnnotation所以为什么它在“注释”数组中?)然后它被转换为NSString *与 a 没有关系的an CLPlacemark。强制转换不会转换pins为字符串——它会将指向的数据pins视为一个NSString(它不是)。

之前发布的代码还有太多其他问题、疑问和未知数。


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

  • 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
    

    这里很重要的一点是,这个例子发送了整个annotations 数组。如果您正在使用显示用户的当前位置,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属于该类型,然后您可以将其强制转换为该自定义类并引用自定义属性。

于 2012-09-15T13:13:45.650 回答