在UIView中重新加载JSON Feed

时间:2010-12-31 06:09:48

标签: iphone json mkmapview

我有一个mapView,它通过JSON添加了注释(feed存储在NSDictionary中)。一切都很好,但我想添加一个功能。

我希望每次视图重新出现时(每次按下标签栏),mapView都会重新加载所有注释。我已经尝试将添加JSON的部分放在viewWillAppear {}中的NSDictionary中....但它不起作用。

我的代码如下。提前致谢!

#import "MapViewController.h"
#import "DisplayMap.h"
#import "JSON/JSON.h"

@implementation MapViewController

@synthesize mapView;
@synthesize selectedType;
@synthesize locationManager;


// JSON from Server Actions
- (NSString *)stringWithUrl:(NSURL *)url {
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url
                                                cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                            timeoutInterval:30];
    // Fetch the JSON response
    NSData *urlData;
    NSURLResponse *response;
    NSError *error;

    // Make synchronous request
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest
                                    returningResponse:&response
                                                error:&error];

    // Construct a String around the Data from the response
    return [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
    }



- (id)objectWithUrl:(NSURL *)url {
    SBJsonParser *jsonParser = [SBJsonParser new];
    NSString *jsonString = [self stringWithUrl:url];

    // Parse the JSON into an Object
    return [jsonParser objectWithString:jsonString error:NULL];
    }

- (NSDictionary *) downloadFeed {
    id response = [self objectWithUrl:[NSURL URLWithString:@"http://www.example.com/JSON"]];

    NSDictionary *feed = (NSDictionary *)response;
    return feed;
    }




// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate:self];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locationManager startUpdatingLocation];

    mapView.mapType = MKMapTypeStandard;
    mapView.zoomEnabled = YES;
    mapView.scrollEnabled = YES;
    mapView.showsUserLocation = YES;

    MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
    region.span.longitudeDelta = 0.005;
    region.span.latitudeDelta = 0.005;
    [mapView setRegion:region animated:YES]; 
    [mapView setDelegate:self];


    // Download JSON Feed
    NSDictionary *feed = [self downloadFeed];
    NSArray *streams = (NSArray *)[feed valueForKey:@"stream"];

    int Info;
    for (Info = 0; Info < streams.count; Info++) {
        NSDictionary *stream = (NSDictionary *)[streams objectAtIndex:Info];
        NSLog(@"Time: %@", [stream valueForKey:@"Time"]); 
        NSLog(@"Type: %@", [stream valueForKey:@"Type"]); 
        NSLog(@"Longitude: %@", [stream valueForKey:@"Longitude"]); 
        NSLog(@"Latitude: %@", [stream valueForKey:@"Latitude"]); 

        double lat = [[stream valueForKey:@"Latitude"] doubleValue];
        double lon = [[stream valueForKey:@"Longitude"] doubleValue];
        NSString *ttype = [[NSString alloc] initWithFormat: @"%@", [stream valueForKey:@"Type"]];
        selectedType = ttype;


        CLLocationCoordinate2D coord = {lat, lon};

        DisplayMap *ann = [[DisplayMap alloc] init]; 
        ann.title = [NSString stringWithFormat: @"%@", [stream valueForKey:@"Type"]];
        ann.subtitle = [NSString stringWithFormat: @"%@", [stream valueForKey:@"Time"]];
        ann.coordinate = coord;

        [mapView addAnnotation:ann];
        }
      }
   }
}


-(void)viewWillAppear { }


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  {
    CLLocationCoordinate2D loc = [newLocation coordinate];
    [mapView setCenterCoordinate:loc];      
    }


-(IBAction)refreshMap:(id)sender {
    // Download JSON Feed
    NSDictionary *feed = [self downloadFeed];
    NSArray *streams = (NSArray *)[feed valueForKey:@"stream"];

    int Info;
    for (Info = 0; Info < streams.count; Info++) {
        NSDictionary *stream = (NSDictionary *)[streams objectAtIndex:Info];
        NSLog(@"Time: %@", [stream valueForKey:@"Time"]); 
        NSLog(@"Type: %@", [stream valueForKey:@"Type"]); 
        NSLog(@"Longitude: %@", [stream valueForKey:@"Longitude"]); 
        NSLog(@"Latitude: %@", [stream valueForKey:@"Latitude"]); 

        double lat = [[stream valueForKey:@"Latitude"] doubleValue];
        double lon = [[stream valueForKey:@"Longitude"] doubleValue];
        NSString *ttype = [[NSString alloc] initWithFormat: @"%@", [stream valueForKey:@"Type"]];
        selectedType = ttype;


        CLLocationCoordinate2D coord = {lat, lon};

        DisplayMap *ann = [[DisplayMap alloc] init]; 
        ann.title = [NSString stringWithFormat: @"%@", [stream valueForKey:@"Type"]];
        ann.subtitle = [NSString stringWithFormat: @"%@", [stream valueForKey:@"Time"]];
        ann.coordinate = coord;

        [mapView addAnnotation:ann];
    }
}


-(MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation {

    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;  //return nil to use default blue dot view

    static NSString *AnnotationViewID = @"annotationViewID";
    MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

    if (annotationView == nil) {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
        }

    annotationView.canShowCallout = YES;

    if ([annotationView.annotation.title isEqualToString:@"Selected"]) {
        UIImage *pinImage = [UIImage imageNamed:@"icon_selected.png"];
        [annotationView setImage:pinImage];
        }

    annotationView.annotation = annotation;
    return annotationView;

    }


- (void)dealloc {
    [mapView release];

    self.adView.delegate = nil;
    self.adView = nil;

    [super dealloc];
}

@end

2 个答案:

答案 0 :(得分:2)

来自UIViewController.h:

- (void)viewWillAppear:(BOOL)animated;

viewWillAppearviewWillAppear:不同。也许如果你覆盖正确的方法它可能会起作用?

答案 1 :(得分:0)

我认为需要更多细节。如果未调用viewWillAppear,则可能与您设置视图的方式有关。

这两个链接应该给你一些指示。 How do I have a view controller run updating code when it is brought to the top of the stack of views?

What's the proper way to add a view controller to the view hierarchy?