从另一个类访问时,NSString返回(null)

时间:2014-01-22 12:03:59

标签: ios objective-c xcode class nsstring

我从另一个类访问NSString时遇到问题,因为它始终返回(null)。目前我有两个视图控制器,第一个具有用户坐标,第二个具有MKMapView,用于显示带有引脚的地图上的当前用户位置。问题是我希望引脚在其副标题中显示用户位置的坐标,但latitudeString的值始终为(null),但仅限于另一个ViewController,因为在第一个latitudeString正确显示纬度值。

以下是代码:

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

有人可以帮我解决这个问题吗?感谢。

3 个答案:

答案 0 :(得分:1)

这是因为您在locationManager: didUpdateLocations:方法调用中设置了latitudeString的值,但是在MapViewController中,自创建firstViewController以来,您还没有调用该方法。

答案 1 :(得分:0)

只有在调用

时才设置latitudeString的值
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

如果在创建firstViewController实例后没有调用该方法,则latitudeString肯定会指向nil。

此方法是来自locationManager的callBack。尝试将init覆盖到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实例。希望这会有所帮助。

答案 2 :(得分:0)

你可以做一件事,在.pch文件中声明一个NSString变量,这样它就会全局声明,并且可以从任何类访问。然后在 ViewController.m 中进行以下更改:

 - (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 
}

我希望它对你有用。如果您需要澄清,请告诉我。