Получить обновление CoreLocation до заполнения TableView? - PullRequest
0 голосов
/ 07 июня 2010

У меня есть материал corelocation в контроллере uitableview. Я на самом деле хочу получить расстояние от двух мест и распечатать это расстояние в ячейке таблицы.

проблема в том, что просмотр таблицы заполняется до того, как произойдет весь процесс выделения ядра. Как я могу сделать corelocation делает все обновления до заполнения таблицы?

вот мой класс:

//
//  EntriesListViewController.m
//  OEAW_App
//
//  Created by Clemens on 6/6/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "EntriesListViewController.h"
#import "EntryDetailController.h"


@implementation EntriesListViewController

@synthesize locationManager;
@synthesize delegate;

NSMutableDictionary *entries;
NSMutableDictionary *dictionary;

CLLocation *coords;

/*- (id) init {
    self = [super init];
    if (self != nil) {
        self.locationManager = [[[CLLocationManager alloc] init] autorelease];
        self.locationManager.delegate = self;
    }
    return self;
}*/

- (CLLocationManager *)locationManager {

    if (locationManager != nil) {
        return locationManager;
    }

    locationManager = [[CLLocationManager alloc] init];
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    locationManager.delegate = self;

    return locationManager;
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    //coords.longitude = newLocation.coordinate.longitude;
    //coords.latitude = newLocation.coordinate.latitude;
    coords = newLocation;
    NSLog(@"Location: %@", [newLocation description]);
}

- (void)locationManager:(CLLocationManager *)manager
             didFailWithError:(NSError *)error
{
    NSLog(@"Error: %@", [error description]);
}


- (void)viewDidLoad {

    //[[MyCLController alloc] init];
    //[locationManager startUpdatingLocation];

    [[self locationManager] startUpdatingLocation];

    //---initialize the array--- 
    //entries = [[NSMutableArray alloc] init];

    //---add items--- 
    //NSString *Path = [[NSBundle mainBundle] bundlePath];
    //NSString *DataPath = [Path stringByAppendingPathComponent:@"Memorials.plist"];

    dictionary = [[NSDictionary alloc] initWithContentsOfURL:[NSURL URLWithString: @"http://akm.madison.at/memorials.xml"]];

    /*NSDictionary *dssItem = [dictionary objectForKey:@"1"];
    NSString *text = [dssItem objectForKey:@"text"];
    */

    //entries = [[NSMutableDictionary alloc] init];

    NSLog(@"%@", dictionary);


    //Path get the path to MyTestList.plist
    NSString *path=[[NSBundle mainBundle] pathForResource:@"Memorials" ofType:@"plist"];
    //Next create the dictionary from the contents of the file.
    NSDictionary *dict=[NSDictionary dictionaryWithContentsOfFile:path];

    //now we can use the items in the file.
//  self.name.text = [dict valueForKey:@"Name"] ;
    NSLog(@"%@",[dict valueForKey:@"Name"]);

    //---set the title--- 
    self.navigationItem.title = @"Türkendenkmäler";

    [super viewDidLoad];   
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [dictionary count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    NSArray *keys = [dictionary allKeys];
    id key = [keys objectAtIndex:indexPath.row];
    NSDictionary *tmp = [dictionary objectForKey:key];
    NSString *name = [tmp objectForKey:@"name"];
    cell.textLabel.text = name;
    cell.font = [UIFont fontWithName:@"Helvetica" size:12.0];

    CLLocation *location = [[CLLocation alloc] initWithLatitude:[[tmp valueForKey:@"coords_x"] floatValue] 
                                                                                                        longitude:[[tmp valueForKey:@"coords_y"] floatValue]];

    /*CLLocation *newLoc = [[CLLocation alloc] initWithLatitude:coords.latitude 
                                                                                                        longitude:coords.longitude];*/


    //locationController = [[MyCLController alloc] init];



    int distance = [coords distanceFromLocation:location];

    NSLog(@"%@",distance);
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@m",distance];
    //NSLog(@"%@", [getLocation newLoc]);

    return cell;
}

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    EntryDetailController *detailViewController = 
    [[EntryDetailController alloc]
     initWithNibName:@"EntryDetailController" bundle:nil];

    //detailViewController.entrySelected = [dictionary objectAtIndex:indexPath.row];

    NSArray *keys = [dictionary allKeys];
    id key = [keys objectAtIndex:indexPath.row];
    NSDictionary *tmp = [dictionary objectForKey:key];
    NSString *name = [tmp objectForKey:@"name"];
    detailViewController.entrySelected_name = name;

    NSString *location = [tmp objectForKey:@"location"];
    detailViewController.entrySelected_location = location;

    NSString *type = [tmp objectForKey:@"type"];
    detailViewController.entrySelected_type = type;

    NSString *slug = [tmp objectForKey:@"slug"];
    detailViewController.entrySelected_slug = slug;


    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)dealloc {
    [entries release];
    [super dealloc];
}


@end

1 Ответ

1 голос
/ 16 июня 2010

Запрет обновления таблицы до тех пор, пока менеджер местоположений не сделает , возможно , но есть более простой способ, который, вероятно, более значим для ваших пользователей.Я бы сделал это, используя двухэтапный процесс.

  1. В методе cellForRowAtIndexPath укажите некоторое значимое значение для расстояния, которое указывает пользователям, что местоположение еще не обновлено.Например, проверьте, является ли ваше значение координат равным nil, и если да, установите для cell.detailTextLabel.text значение «?»или "-" или тому подобное.
  2. В locationManager: didUpdateToLocation: fromLocation поместите эту строку кода

[self.tableView reloadData];

Таким образомзначение расстояния в ячейке табличного представления будет обновляться по мере того, как менеджер местоположения будет получать более точные данные.Это также дает дополнительное преимущество представления значимых данных, даже если менеджер местоположений никогда не обновляется, в отличие от вашего метода, который никогда не будет отображать ваше табличное представление.

...