Search code examples
iosdelegatesprotocolsrespondstoselector

ios - respondsToSelector always false with custom delegate


I was playing around with MKMap and some custom delegate it's not working here and i really don't know why :/

Here's my code :

LocationViewController.h

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

@protocol LocationViewDelegate <NSObject>

@required
- (void)didReceiveLocation:(CLLocation *)location;

@end

@interface LocationViewController : UIViewController <CLLocationManagerDelegate>

@property (strong, nonatomic) IBOutlet UILabel *locationLabel;
@property (nonatomic, strong) id<LocationViewDelegate> delegate;

- (IBAction)sendLocation:(id)sender;

@end

LocationViewController.m

[...]
- (IBAction)sendLocation:(id)sender {
    if ([_delegate respondsToSelector:@selector(didReceiveLocation:)]) {
        [_delegate didReceiveLocation:_currentLocation];
    } else {
        NSLog(@"nope");
    }
}
[...]

MapViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "LocationViewController.h"

@interface MapViewController : UIViewController <LocationViewDelegate>

@end

MapViewController.m

[...]
- (void)didReceiveLocation:(CLLocation *)location {
    _mapView.centerCoordinate = location.coordinate;
}
[...]

I'm always getting the "nope" message means that respondsToSelector returns NO. I did pretty the same example a few days ago and everything was fine.

Someone can see where's the problem here ?


Solution

  • Set your MapViewController as the delegate for the LocationViewController i.e. in your MapViewController.m:

    self.locationViewController.delegate = self;
    

    Just as an aside, I'm presuming your MapViewController owns a LocationViewController instance, if so it's better to set the delegate property in LocationViewController to 'weak' to avoid a circular reference. @property (nonatomic, weak) id delegate;