2013-11-22 1 views
0

간단한지도 앱을 만들고 있습니다 - pubnub 채널에서 위치와 텍스트를 송수신하고 있습니다. 채팅 메시지가 오면 간단한 MKAnnotation을 사용하여 채팅을 그려보고 싶습니다 (저는 이것이 UX의 무시 무시한 행위이며 걱정하지 않는다는 것을 알고 있습니다).iOS - 동적으로 추가 할 때 기본 MKAnnotation이 표시되지 않습니다.

내 응용 프로그램 대리인이 pubnub 채널에서 메시지를 받으면 주 뷰 컨트롤러의 메서드를 호출하여지도에 텍스트 메시지를 그립니다. 이 메소드는 핀의 좌표에 대해 최신 사용자 위치를 사용해야합니다.

왜 그런지 모르겠지만 내 방법 내에서 보여줄 주석을 가져올 수 없습니다. 메서드 내에서 주석을 작성하고 보여 주려고했습니다. 또한 커스텀 어노테이션 클래스를 만들어 내 메소드 내에서 호출 해 보았습니다. 매우 동일한 주석 코드를 사용하지만 내 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]; 

} 

그리고 MyLocationAnnotation.m

#import "MyLocationAnnotation.h" 

@implementation MyLocationAnnotation 

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

@end 
+0

drawChat 메소드를 호출하기 전에 didUpdateLocation이 호출되고 있습니까? 먼저 userLocation을 확인하십시오. –

+0

Thanks Bhumeshwer - drawChat 메서드 내에서 userLocation을 확인했으며 위도와 경도로 올바르게 채워졌습니다. –

+0

didReceiveMessage에서 MyLocationViewController의 새 인스턴스를 만들고 그 인스턴스가 표시 (표시)되지 않습니다. 원본 MyLocationViewController가 생성되고 표시되는 위치는 어디입니까? – Anna

답변

1

덕분에 잘못된 내가 할 수 있었다 이 문제를 해결하려면

,210

대신 애플 대리자에서 내 기본보기 컨트롤러를 redclaring의 내가 대신 이런 짓을 :

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

내가 다음 애플 대리자의 데이터와 잘 메소드를 호출 할 수 있었다.

관련 문제