在 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;

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

【讨论】:

【参考方案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 提要的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView 中重新加载 UITableView

使用 nib 中的视图重新加载 UIView 属性

iOS为啥只有在重新加载UITableView后才能正确显示UIView

如何在 UIView swift 中重新加载特定的子视图?

如何重新加载 UIView?

为啥我的 UIView 在重新加载后没有响应?