iOS xCode/Objective C - Простой - Отображать город пользователя в виде метки?

Хорошо, я делаю приложение для iOS. Я НЕВЕРОЯТНО новичок в программировании приложений для iOS... (У меня есть опыт программирования, но это совершенно новое для меня)

Я пытаюсь отобразить город и штат пользователя на экране. Я не знаю, что я делаю неправильно. У меня есть это: (Есть предупреждение, в котором говорится, что неиспользуемые переменные город и штат [я не знаю, как это исправить]). Кстати, это один вид, и я также использую раскадровку (хотелось бы, чтобы я этого не делал). т должен.. работать намного лучше просто с кодом)

#import "VOIViewController.h"
#import <CoreLocation/CoreLocation.h>
#import <AddressBook/AddressBook.h>

@interface VOIViewController ()  <CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (weak, nonatomic) IBOutlet UILabel *city;
@property (weak, nonatomic) IBOutlet UILabel *state;

@end

@implementation VOIViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
   }

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)startSignificantChangeUpdates
{
    if ([CLLocationManager locationServicesEnabled])
    {
        if (!self.locationManager)
            self.locationManager = [[CLLocationManager alloc] init];

    self.locationManager.delegate = self;
    [self.locationManager startMonitoringSignificantLocationChanges];
}
}

- (void)stopSignificantChangesUpdates
{
    [self.locationManager stopUpdatingLocation];
    self.locationManager = nil;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {

    CLPlacemark *placemark = placemarks[0];
    NSDictionary *addressDictionary = [placemark addressDictionary];
    NSString *city = addressDictionary[(NSString *)kABPersonAddressCityKey];
    NSString *state = addressDictionary[(NSString *)kABPersonAddressStateKey];




}];

[self stopSignificantChangesUpdates];
}

@end

ОБНОВЛЕНО: (Но по-прежнему ничего на экране... Я вижу только город и штат, но на самом деле они не отображают город и штат. Что-то здесь не связано.)

#import "VOIViewController.h"
#import <CoreLocation/CoreLocation.h>
#import <AddressBook/AddressBook.h>

@interface VOIViewController ()  <CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (weak, nonatomic) IBOutlet UILabel *city;
@property (weak, nonatomic) IBOutlet UILabel *state;

@end

@implementation VOIViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
   }

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)startSignificantChangeUpdates
{
    if ([CLLocationManager locationServicesEnabled])
    {
        if (!self.locationManager)
            self.locationManager = [[CLLocationManager alloc] init];

        self.locationManager.delegate = self;
        [self.locationManager startMonitoringSignificantLocationChanges];
    }
}

- (void)stopSignificantChangesUpdates
{
    [self.locationManager stopUpdatingLocation];
    self.locationManager = nil;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {

        CLPlacemark *placemark = placemarks[0];
        NSDictionary *addressDictionary = [placemark addressDictionary];
        self.city.text = addressDictionary[(NSString *)kABPersonAddressCityKey];
        self.state.text = addressDictionary[(NSString *)kABPersonAddressStateKey];

    }];

    [self stopSignificantChangesUpdates];
}

@end

person user3159537    schedule 24.03.2014    source источник
comment
Попробуйте вставить обновленный код   -  person Marius Waldal    schedule 24.03.2014
comment
Да, я сделал, но я все еще ничего не получаю на экране.   -  person user3159537    schedule 24.03.2014
comment
Я отредактировал свой ответ. Пожалуйста, проверь это.   -  person Sujith Thankachan    schedule 24.03.2014


Ответы (6)


Вы сохраняете название города и штата в NSString, не используя их, поэтому отображается предупреждение. Создайте метку и назначьте им значения как label_name.text = city;

person demonofthemist    schedule 24.03.2014

Да, вы получаете город и штат как объект NSString, но нигде их не используете.

NSString *city = addressDictionary[(NSString *)kABPersonAddressCityKey];
NSString *state = addressDictionary[(NSString *)kABPersonAddressStateKey];

вы назначаете как

city.text= city/// city.text is label .......
state.text = state///// state.text is label.......... 

Также различайте объект этикетки как cityLAbel и sateLabel

person Macrosoft-Dev    schedule 24.03.2014
comment
Извините, но где я должен указать city.text = city и state.text = state ? - person user3159537; 24.03.2014
comment
ваш метод locationManager - person Macrosoft-Dev; 24.03.2014

Вы не устанавливаете текст в метках.

Удалите NSString *city/state из вашего locationManager, так как это создает только локальную переменную NSString с тем же именем, что и ваши свойства UILabel.

Тогда вместо этого:

self.city.text = addressDictionary[(NSString *)kABPersonAddressCityKey];
self.state.text = addressDictionary[(NSString *)kABPersonAddressStateKey];

Между прочим, общепринятым соглашением при маркировке свойств является указание типа представления, которое вы используете. UILabel обычно называют cityLabel, UITextView обычно называют bodyTextView и т. д.

Кроме того, убедитесь, что вы подключили свойства к фактическим меткам в Интерфейсном Разработчике (в раскадровке).

person Marius Waldal    schedule 24.03.2014

Вы можете сделать это в

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {

CLPlacemark *placemark = placemarks[0];
NSDictionary *addressDictionary = [placemark addressDictionary];

dispatch_async(dispatch_get_main_queue(), ^{
        self.city.text = addressDictionary[(NSString *)kABPersonAddressCityKey];
        self.state.text = addressDictionary[(NSString *)kABPersonAddressStateKey];
    });


}];
person Akhilrajtr    schedule 24.03.2014
comment
Я понимаю, что вы сделали в какой-то степени, но на экране ничего не отображается. - person user3159537; 24.03.2014
comment
Это не сработает, так как вы не можете напрямую установить строку для города или штата. Вам нужно установить его в свойстве .text метки. - person Marius Waldal; 24.03.2014
comment
@Handsomeguy, это была ошибка, теперь я ее отредактировал. - person Akhilrajtr; 24.03.2014
comment
Вижу. Отсутствовал .text. Сейчас нет предупреждения, но в симуляторе по-прежнему ничего не появляется? Я сделал название города и штата на своей раскадровке. - person user3159537; 24.03.2014
comment
На самом деле, чтобы уточнить, это единственное, что показывает. Я поместил «город» и «штат» в свою раскадровку, и это единственные отображаемые слова, но не город и штат. - person user3159537; 24.03.2014
comment
@ user3159537 ты подключил IBOutlet из UILabel? - person Akhilrajtr; 24.03.2014
comment
Я почти уверен, что сделал. В моем исходном коде вверху вы видите @property для города и штата. Я сделал это, перетащив метку из раскадровки в код с помощью кнопки управления на клавиатуре. - person user3159537; 24.03.2014
comment
@user3159537 user3159537 есть ли у addressDictionary значения? Ставь NSLog и проверяй. - person Akhilrajtr; 24.03.2014
comment
@user3159537 user3159537 вы тестируете приложение в симуляторе iOS? - person Sujith Thankachan; 24.03.2014
comment
Да, я тестирую его в симуляторе iOS.. и я сделал скриншот того, что, как мне кажется, является NSLog .imgur.com/2zQuHeg.png... это оно? Я также не понимаю, почему это не будет работать на моем ноутбуке... это немного по-другому, но пару дней назад, когда я экспериментировал с чужим кодом (appcoda.com/how-to-get-current-location-iphone-user). /lat, и я проверил это на своем ноутбуке. (Мак Эйр, 2013 г.) - person user3159537; 24.03.2014
comment
@user3159537 user3159537 Попробуйте имитировать местоположение, если вы этого не делаете. Проверьте здесь - person Akhilrajtr; 24.03.2014
comment
Просто сделал это и ничего не получил. Я указал Apple в качестве своего местоположения, затем переключил его на другие параметры ... и все равно ничего. - person user3159537; 24.03.2014

Установите свои UILabel с адресом, полученным из ответа CLGeocoder.

Для этого обновления - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations следующим образом:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {

    CLPlacemark *placemark = placemarks[0];
        NSDictionary *addressDictionary = [placemark addressDictionary];
        NSString *cityText = addressDictionary[(NSString *)kABPersonAddressCityKey];
        NSString *stateText = addressDictionary[(NSString *)kABPersonAddressStateKey];

        self.city.text = [NSString stringWithFormat:@"%@", cityText]; 
        self. state.text = [NSString stringWithFormat:@"%@", stateText];
    }];

    [self stopSignificantChangesUpdates];
}

ИЗМЕНИТЬ

Вы нигде не вызывали startSignificantChangeUpdates метод. Это проблема. Вызовите его в своем viewDidLoad используя код: [self startSignificantChangeUpdates];

person Sujith Thankachan    schedule 24.03.2014
comment
Бро спасибо! Осталась только небольшая проблема. Город меняется на CA, а штат ничего не делает. Он просто остается «государством»... почему город CA? - person user3159537; 24.03.2014

Вы не используете город и штат переменных NSString, имя которых вы указали так же, как имя метки.

Итак, чтобы исправить это, вы должны напрямую назначить город и штат тексту метки города и штата:

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
   CLPlacemark *placemark = placemarks[0];
   NSDictionary *addressDictionary = [placemark addressDictionary];

   /* Delete the code I commented
   NSString *city = addressDictionary[(NSString *)kABPersonAddressCityKey];
   NSString *state = addressDictionary[(NSString *)kABPersonAddressStateKey];
    */

   _city.text = addressDictionary[(NSString *)kABPersonAddressCityKey];
   _state.text = addressDictionary[(NSString *)kABPersonAddressStateKey];
}];

или вы можете присвоить переменные city и state тексту метки города и штата:

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
   CLPlacemark *placemark = placemarks[0];
   NSDictionary *addressDictionary = [placemark addressDictionary];
   NSString *city = addressDictionary[(NSString *)kABPersonAddressCityKey];
   NSString *state = addressDictionary[(NSString *)kABPersonAddressStateKey];

   NSLog(@"City => %@", city);
   NSLog(@"State => %@", state);

   _city.text = city;
   _state.text = state;
}];

в вашем коде

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}

и если вы не подключили IBOutlets ярлыков, то сначала подключите их, чтобы сделать это, вы должны

Ctrl + Click on ViewController in Storyboad and then drag the connecting line to city and state label.

Он покажет вам название города и штата в открывшемся списке, выберите из него соответствующее имя IBOutlet.

person Yash Vyas    schedule 24.03.2014
comment
Да, чувак, я контролировал + щелкнул ViewController, и на экране по-прежнему ничего, кроме текста «город» и «штат». - person user3159537; 24.03.2014
comment
Добавьте точку останова в назначение _city.text, затем запустите проект для отладки. Он придет через некоторое время, а затем проверьте его построчно. - person Yash Vyas; 24.03.2014
comment
Вы можете зарегистрировать город и штат, используя функцию NSLog(), чтобы проверить обратное геокодирование. Проверьте мою версию кода во втором блоке. - person Yash Vyas; 24.03.2014