开发者

Reload JSON Feed within a UIView

开发者 https://www.devze.com 2023-02-02 02:09 出处:网络
I have a mapView that has annotation added through JSON (feed is stored in NSDictionary). Everything works great, but I want to add a feature.

I have a mapView that has annotation added through JSON (feed is stored in NSDictionary). Everything works great, but I want to add a feature.

I want the mapView to reload all of the annotations each time the view reappears (every time the tab bar is pressed). T've tried putting the part where the JSON is added to the NSDictionary in viewWillAppear {} .... but it does not work.

My code is below. Thanks开发者_运维知识库 in advance!

#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


From UIViewController.h:

- (void)viewWillAppear:(BOOL)animated;

viewWillAppear is not the same as viewWillAppear:. Perhaps if you override the proper method it might work?


I think more details are needed. If viewWillAppear is not getting called then it is probably something to do with the way you are setting up the views.

These two links should give you some pointers. How do I have a view controller run updating code when it is brought to the top of the stack of views?

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

0

精彩评论

暂无评论...
验证码 换一张
取 消