Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-基本Mkx27;动态添加时不显示_Ios_Annotations_Mapkit - Fatal编程技术网

iOS-基本Mkx27;动态添加时不显示

iOS-基本Mkx27;动态添加时不显示,ios,annotations,mapkit,Ios,Annotations,Mapkit,我正在制作一个简单的地图应用程序——我正在公共频道上发送和接收位置和文本。当收到聊天信息时,我想使用一个简单的MKAnnotation来绘制聊天(我知道这是UX的一个可怕行为,我不在乎) 当my app delegate在pubnub频道上接收到消息时,它调用主视图控制器中的方法在地图上绘制文本消息。该方法应使用pin坐标的最新用户位置 我不知道为什么,但我无法从我的方法中获得要显示的注释。我已经尝试从方法内部构建注释并显示它。我还尝试创建一个自定义注释类,并从方法中调用它。当我使用完全相同的注

我正在制作一个简单的地图应用程序——我正在公共频道上发送和接收位置和文本。当收到聊天信息时,我想使用一个简单的MKAnnotation来绘制聊天(我知道这是UX的一个可怕行为,我不在乎)

当my app delegate在pubnub频道上接收到消息时,它调用主视图控制器中的方法在地图上绘制文本消息。该方法应使用pin坐标的最新用户位置

我不知道为什么,但我无法从我的方法中获得要显示的注释。我已经尝试从方法内部构建注释并显示它。我还尝试创建一个自定义注释类,并从方法中调用它。当我使用完全相同的注释代码,但在viewDidLoad中对其进行硬编码时,它会显示得很好。任何见解都将不胜感激

我的应用程序代理:

#import "MyLocationAppDelegate.h"
#import "MyLocationViewController.h"

@implementation MyLocationAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    [PubNub setDelegate: self];

    return YES;
}

- (void)pubnubClient:(PubNub *)client didReceiveMessage:(PNMessage *)message
{
    NSString* text = message.message; 

    //Call drawChat method of MyLocationViewController

    MyLocationViewController *MyLocViewController = [[MyLocationViewController alloc] init];
    [MyLocViewController drawChat:text];

   }
我的视图控制器:

#import "MyLocationViewController.h"
#import "MyLocationAppDelegate.h"
#import "MyLocationAnnotation.h"


CLLocation *userLocation;

@implementation MyLocationViewController {
     CLLocationManager *locationManager;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Delegate map view

    self.mapView.delegate = self;

    [self SetUpChat];
    [self configurePubNub];

    //Instantiate location manager
    if (nil == locationManager) {
        locationManager = [[CLLocationManager alloc] init];
    }

    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];

    NSLog(@"Application: viewDidLoad");

}

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

}

- (void)drawChat:(NSString *)message
{
    //Create new annotation object

    CLLocationCoordinate2D location;
    location.latitude = userLocation.coordinate.latitude;
    location.longitude = userLocation.coordinate.longitude;

    MyLocationAnnotation *chat = [[MyLocationAnnotation alloc] initWithLocation:location andTitle:message];

    [self.mapView addAnnotation:chat];

}
还有我的位置说明

#import "MyLocationAnnotation.h"

@implementation MyLocationAnnotation

- (id)initWithLocation:(CLLocationCoordinate2D)coord andTitle:(NSString *)ttl {
    self = [super init];
    if (self) {
        _coordinate = coord;
        _title = ttl;
    }
    return self;
}

@end

多亏Anna指出我做错了什么,我才得以解决这个问题:

我没有在应用程序代理中重新声明我的主视图控制器,而是执行了以下操作:

MyLocationViewController *mainController = (MyLocationViewController *) self.window.rootViewController; 
[mainController drawChat:text]; 

然后,我可以使用app delegate的数据调用该方法。

在调用drawChat方法之前,是否调用了didUpdateLocation。首先检查userLocation是否有任何内容。感谢Bhumeshwer-我已从drawChat方法中检查userLocation,它正确填充了纬度和经度。在didReceiveMessage中,您正在创建MyLocationViewController的新实例,该实例从未显示(显示)。最初的MyLocationViewController是在哪里创建和展示的?啊-这很有意义-感谢您的输入。我认为这是一种让appDelegate访问MyLocationViewController中方法的方法。除了MyLocationViewController.m文件之外,我没有在其他任何地方显式创建它-MyLocationViewController中只有一个MKMapView。万岁-谢谢你朝正确的方向推Anna-我能够解决这个问题:我没有在应用程序代理中重新声明我的主视图控制器,而是这样做了:MyLocationViewController*mainController=(MyLocationViewController*)self.window.rootViewController;[mainController drawChat:text];然后,我就能够调用这个方法,只需使用来自app delegate的数据即可。