我从另一个类访问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
有人可以帮我解决这个问题吗?感谢。
答案 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
}
我希望它对你有用。如果您需要澄清,请告诉我。