从地图视图中获取DetailView中的xml数据(Iphone IOS)

时间:2011-03-18 12:16:22

标签: iphone xml ios android-mapview kml

我们正在尝试使用从xml文件加载的注释创建mapview。到目前为止,这是有效的,并且正在苹果开发者库中使用KMLViewer代码。现在我们尝试将XML文件中的数据加载到detailview中,但只加载相应的条目。因此,当您单击某个城市的详细信息时,必须从该城市的xml文件中加载详细信息。

我们现在正在努力,但不知道从哪里开始。我们现在有以下代码:

detailviewcontroller.m

    #import "DetailViewController.h"



@implementation DetailViewController

@synthesize address;




// Implement viewDidLoad to do additional setup after loading the view, typically from a nib
- (void)viewDidLoad
{
    TabbedCalculationAppDelegate *appDelegate = (TabbedCalculationAppDelegate *)[[UIApplication sharedApplication] delegate];
    address.text = appDelegate.addressInput1 ;

    [super viewDidLoad];
}

- (void)viewDidUnload
{
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc
{
    [super dealloc];
}

地图视图

#import "locator.h"
#import "DetailViewController.h"

@implementation locator

@synthesize map, detailViewController, rightButton, customPinView;


- (void)viewDidLoad
{
    [super viewDidLoad];

    // create a custom navigation bar button and set it to always says "Back"
    UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
    temporaryBarButtonItem.title = @"Back";
    self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
    [temporaryBarButtonItem release];

    // Locate the path to the route.kml file in the application's bundle
    // and parse it with the KMLParser.
    NSString *path = [[NSBundle mainBundle] pathForResource:@"branches" ofType:@"kml"];
    kml = [[KMLParser parseKMLAtPath:path] retain];

    // Add all of the MKOverlay objects parsed from the KML file to the map.
    NSArray *overlays = [kml overlays];
    [map addOverlays:overlays];

    // Add all of the MKAnnotation objects parsed from the KML file to the map.
    NSArray *annotations = [kml points];

    [map addAnnotations:annotations];

    // Walk the list of overlays and annotations and create a MKMapRect that
    // bounds all of them and store it into flyTo.
    MKMapRect flyTo = MKMapRectNull;
    for (id <MKOverlay> overlay in overlays) {
        if (MKMapRectIsNull(flyTo)) {
            flyTo = [overlay boundingMapRect];
        } else {
            flyTo = MKMapRectUnion(flyTo, [overlay boundingMapRect]);
        }
    }

    for (id <MKAnnotation> annotation in annotations) {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
        if (MKMapRectIsNull(flyTo)) {
            flyTo = pointRect;
        } else {
            flyTo = MKMapRectUnion(flyTo, pointRect);
        }
    }

    // Position the map so that all overlays and annotations are visible on screen.
    MKCoordinateRegion mapRegion;
    mapRegion.center.latitude = 51.522416;
    mapRegion.center.longitude = 5.141602;
    mapRegion.span.latitudeDelta = 5;
    mapRegion.span.longitudeDelta = 5;
    [map setRegion:mapRegion animated:YES];
}


#pragma mark MKMapViewDelegate

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    return [kml viewForOverlay:overlay];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // if it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    // handle custom annotations
    //        // try to dequeue an existing pin view first
    static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)
    [map dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];

    if (!pinView)
    {
        // if an existing pin view was not available, create one
        customPinView = [[[MKPinAnnotationView alloc]
                                               initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];
        customPinView.pinColor = MKPinAnnotationColorPurple;
        customPinView.animatesDrop = YES;
        customPinView.canShowCallout = YES;

        // add a detail disclosure button to the callout which will open a new view controller page
        //
        // note: you can assign a specific call out accessory view, or as MKMapViewDelegate you can implement:
        //  - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
        //
        rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        customPinView.rightCalloutAccessoryView = rightButton;

        return customPinView;
    }else{
        return pinView;}

    return nil;

}

#pragma mark -
#pragma mark MKMapViewDelegate

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    {
        if (view.annotation == mapView.userLocation)
            return;

        rightButton = (DetailViewController *)view.annotation;        
        //show detail view using buttonDetail...
    }
    // the detail view does not want a toolbar so hide it
    [self.navigationController setToolbarHidden:YES animated:YES];


    [self.navigationController pushViewController:self.detailViewController animated:YES];
}

- (void)viewDidUnload
{
    self.detailViewController = nil;

}

- (void)dealloc 
{
    [detailViewController release];
    [super dealloc];
}

@end

正如你所看到的那样,在尝试了很多东西后,代码开始变得混乱,但我们真的不知道从哪里开始。

非常感谢任何帮助

Thnx提前!

1 个答案:

答案 0 :(得分:2)

请查看KMLParser中KMLPlacemark的界面,在那里您可以看到xml地标元素的精确解析和存储内容。例如,地址丢失。因此,您必须通过实现KMLPlacemark类中的字段并更改KMLParser方法来添加您希望解析器收集的所有信息:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName ...
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName ...

以及KMLPlacemark实现的某些部分。要使用解析器填充新字段,您必须编写- (void)beginName- (void)endName等方法。当你要解析的元素有孩子时会有点棘手。

将KMLParser文件拆分为多个文件可能会有所帮助,每个文件包含一个类。

如果您已经实现了这一点并且您的地标包含所有需要的详细信息,您可以使用MKMapViewDelegate协议点击注释。实现 didDeselectAnnotationView ,它可能如下所示:

- (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    // implementation example of placemarkForAnnotation below
    KMLPlacemark * placemark = [kml placemarkForAnnotation:view.annotation];

    MyDetailViewController * myDetailViewController = [[MyDetailViewController alloc] initWithPlacemark:placemark];

    [self presentModalViewController:myDetailViewController animated:YES];

    [myDetailViewController release];
}

在KMLParser中添加

- (KMLPlacemark *)placemarkForAnnotation:(id <MKAnnotation>)point
{
    // Find the KMLPlacemark object that owns this point and return it
    for (KMLPlacemark *placemark in _placemarks) {
        if ([placemark point] == point)
            return placemark;
    }
    return nil;
}

希望我能指出你正确的方向。这将是一些工作;)