在 UIView 中重新加载 JSON 提要
Posted
技术标签:
【中文标题】在 UIView 中重新加载 JSON 提要【英文标题】:Reload JSON Feed within a UIView 【发布时间】:2010-12-31 06:09:47 【问题描述】:我有一个通过 JSON 添加注释的 mapView(提要存储在 NSDictionary 中)。一切都很好,但我想添加一个功能。
我希望 mapView 在每次视图重新出现时重新加载所有注释(每次按下标签栏时)。 T've 尝试将 JSON 添加到 NSDictionary 的部分放在 viewWillAppear
.... 但它不起作用。
我的代码如下。提前致谢!
#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
【问题讨论】:
【参考方案1】:来自 UIViewController.h:
- (void)viewWillAppear:(BOOL)animated;
viewWillAppear
与 viewWillAppear:
不同。也许如果您覆盖正确的方法,它可能会起作用?
【讨论】:
【参考方案2】:我认为需要更多细节。如果 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?
【讨论】:
谢谢!我会调查这些。仅供参考,viewWillAppear 确实会加载信息……但在第二次或第三次访问后似乎不会重新加载。 缓存策略呢?这可能是问题吗?把它改成 NSURLRequestReloadRevalidatingCacheData 怎么样以上是关于在 UIView 中重新加载 JSON 提要的主要内容,如果未能解决你的问题,请参考以下文章