我有一个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
答案 0 :(得分:2)
来自UIViewController.h:
- (void)viewWillAppear:(BOOL)animated;
viewWillAppear
与viewWillAppear:
不同。也许如果你覆盖正确的方法它可能会起作用?
答案 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?