2014-01-22 6 views
-2

У меня есть проблема с доступом к NSString из другого класса, потому что он всегда возвращается как (null). В настоящее время у меня есть два контроллера вида, у первого есть координаты пользователей, а у второго есть MKMapView, которые показывают текущую позицию пользователя на карте с помощью булавки. Проблема в том, что я хочу, чтобы штырь отображал координаты позиции пользователя в его субтитрах, но значение latitudeString всегда (null), но только на другом ViewController, потому что на первом latitudeString отобразите значение широты правильно.NSString возвращает (null) при доступе из другого класса

Вот код:

ViewController.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 

@interface ViewController : UIViewController <CLLocationManagerDelegate> 
{ 

} 

@property (strong, nonatomic) NSString       *latitudeString; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 
{ 

} 

@property (strong, nonatomic) CLLocationManager     *locationManager; 

@end 

@implementation ViewController 
{ 
    CLLocation   *newLocation; 
} 

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

    self.latitudeString = [NSString stringWithFormat:@"%g\u00B0", newLocation.coordinate.latitude]; 
} 

@end 

MapViewController.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 

@interface MapViewController : UIViewController <MKMapViewDelegate> 
{ 
    ViewController    *firstViewController; 
} 

@property (strong, nonatomic) ViewController    *firstViewController; 
@property (strong, nonatomic) IBOutlet MKMapView   *mapView; 

@end 

MapViewController.m

#import "MapViewController.h" 
#import "ViewController.h" 

@interface MapViewController() 
{ 

} 

@end 

@implementation MapViewController 

- (void)viewDidLoad 
{ 
    self.mapView.showsUserLocation = YES; 
    self.mapView.delegate = self; 
    self.mapView.mapType = MKMapTypeHybrid; 
    self.mapView.userLocation.title = @"Posizione attuale"; 

    firstViewController = [[ViewController alloc] init]; 

    self.mapView.userLocation.subtitle = [NSString stringWithFormat:@"%@", firstViewController.latitudeString]; // Nil 

    [super viewDidLoad]; 
} 

@end 

Может кто-нибудь помочь мне с этой проблемой? Благодарю.

+0

Я чувствую, что в последнее время я видел подобную тему. Я предполагаю, что это «Невозможно получить доступ к NSString другого класса». –

+0

Где ваш экземпляр 'CLLocationManager' в первом контроллере представления был инициализирован и начал обновлять местоположения? – Zen

+1

Вы назначаете новый экземпляр 'ViewController'. –

ответ

0

Вы можете установить значение latitudeString только тогда, когда вы звоните

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

Если вы не вызываете этот метод после создания экземпляра firstViewController, latitudeString, безусловно, будет указывать на ноль.

Этот метод является вызовом из диспетчера location. Попробуйте перезаписать инициализации в реализации firstViewController следующим образом:

- (instancetype)init 
{ 
    self = [super init]; 
    if (self){ 
     self.locationManager = [CLLocationManager init]; 
     self.locationManager.delegate = self; 
     [self.locationManager startUpdatingLocation]; 
    } 
    return self; 
} 

И сделать свой firstViewController реализующий протокол «CLLocationManagerDelegate».

Таким образом, вы должны иметь возможность запустить locationManager, и метод делегата должен быть вызван автоматически. И как только будет вызван метод, NSString будет настроен так, как ожидалось.

Однако я не понимаю, почему вы хотите создать новый объект VC таким образом? Вы собираетесь представить на экране позже?

Лично я бы рекомендовал иметь отдельный класс для управления CLLocationManager, реализующего одноэлементный шаблон - чтобы вы могли получить доступ к тому же экземпляру CLLocationManager из любого места вашего приложения. Надеюсь это поможет.

+0

Должен ли я разместить этот код в MapViewController.m? – Aluminum

+1

Нет, потому что didUpdateLocations является обратным вызовом делегата. Чтобы это можно было назвать, вам нужно настроить и запустить locationManager в firstViewController. Где-то вам нужно это сделать - я добавлю код в свой ответ, поскольку я не могу его здесь написать. – tanzolone

+0

Большое спасибо, я не очень практичен, и я все еще не могу понять проблему здесь: -/ – Aluminum

1

Это связано с тем, что вы устанавливаете значение latitudeString в вызове метода locationManager: didUpdateLocations:, но в вашем MapViewController вы не вызывали этот метод с момента создания firstViewController.

+0

Привет, Энрико, как я могу назвать этот метод в другом viewController? Можете ли вы показать мне какой-то код? – Aluminum

+0

В примере, который вы нам показали, есть несколько проблем. Мы не совсем уверены, что вы действительно хотите с этим кодом, но я думаю, что 'didUpdateLocations' является обратным вызовом делегата при обновлении местоположения с помощью' CLLocation'. Объяснение очень длинное, я думаю, вы должны прочитать на CLLocation и сначала увидеть пример кода в других местах. –

0

Вы можете сделать одно: объявить переменную NSString в файле .pch, чтобы она объявлялась глобально и могла быть доступна из любого класса. затем в ViewController.м вы меняете ниже:

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

{ 
newLocation = [locations lastObject]; 

self.latitudeString = [NSString stringWithFormat:@"%g\u00B0", newLocation.coordinate.latitude]; 
string_declare_in_pch=self.latitudeString; // new line 

} 

и MapViewController.m

- (void)viewDidLoad { 
self.mapView.userLocation.subtitle = [NSString stringWithFormat:@"%@", string_declare_in_pch]; // new 
} 

Я надеюсь, что это будет работать для вас. дайте мне знать, если вам нужно какое-либо разъяснение.

Смежные вопросы