使用地图注释而不是表视图中的行来引用所选对象

时间:2014-03-06 21:20:53

标签: ios core-data mkmapview nsfetchedresultscontroller

我有一个地图视图,其中使用Core Data填充了名为Venues的对象。我通过fetchedResultsController将数据转换为地图注释,如下所示:

-(void) createAnnotations { 
    _annotations=[[NSMutableArray alloc] init];

    for(Venue *selectedVenue in [self.fetchedResultsController fetchedObjects]) {

        currentVenue = NULL;

        double clatD = [selectedVenue.clat doubleValue];
        double clongD = [selectedVenue.clong doubleValue];

        CLLocationCoordinate2D selectedCoord;
        selectedCoord.latitude = clatD;
        selectedCoord.longitude = clongD;

        MyAnnotation* annot=[[MyAnnotation alloc] init];

        annot.coordinate=selectedCoord;
        annot.title=selectedVenue.title;
        annot.subtitle=selectedVenue.address;

        [_annotations addObject:annot];
    }

然后我使用以下方法在地图上绘制注释:

[mapView addAnnotations:_annotations];

可能有一种更好的做事方式,但嘿,它有效。

无论如何,这个问题。我设置它,以便当用户按下注释时,它会切换到详细视图,该视图旨在获得有关该特定Venue对象的更多信息。这是信息传递的地方,而这就是我被困住的地方:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"showVenueDetailFromMap"]) {
        DisplayDetailViewController *ddvc = (DisplayDetailViewController *) [segue destinationViewController];

// This is where I want to pass the chosen object to the next view. But how?        
     Venue *selectedVenue = (Venue *) [self.fetchedResultsController objectAtIndexPath:???];
     ddvc.currentVenue = selectedVenue;
    }
}

我认为它可能与下一段代码有关。据我所知,这是应用程序知道哪个Venue被选中的唯一地方。但是所有它知道的是注释的内容(即标题,副标题,坐标),那么如何将它从fetchedResultsController链接回原来的Venue对象?

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    [self performSegueWithIdentifier:@"showVenueDetailFromMap" sender:self];

    NSLog(@"%@",view.annotation.title);
    NSLog(@"%@",view.annotation.subtitle);
}

关于上述的说明。我从桌面视图中完成了这个设置。我只是像这样引用选定的行:

 NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
 Venue *selectedVenue = (Venue *) [self.fetchedResultsController objectAtIndexPath:indexPath];

我不知道如何使用基于注释的地图设置做同样的事情,而不是我的漂亮的表设置充满行和部分。

我希望这是有道理的。我很欣赏这是一个非常简单的问题。基本上我要问的是“在使用地图视图而不是表视图时如何从fetchedResultsController引用对象?”

任何想法都会非常感激!

1 个答案:

答案 0 :(得分:1)

修改MyAnnotation类以保存索引路径属性。通过从FRC请求indexPathForObject:selectedVenue来创建注释时设置此项。

选择注释后,您现在可以获取索引路径并将其存储为currentVenue(或者可以将其作为segue的发送者传递)。