делегаты метода не вызывают - PullRequest
1 голос
/ 12 октября 2011

Я пытался реализовать это:

UICRouteOverlayMapView

.h file
@protocol DrawingDataDelegate <NSObject>
@required
-(void) drawingSuccessful:(BOOL)done;
@end

@interface UICRouteOverlayMapView : UIView {
    id <DrawingDataDelegate> delegate;
}

- (id)initWithMapView:(MKMapView *)mapView;

@property (nonatomic, retain) id <DrawingDataDelegate> delegate;
@end

 .m file
@implementation UICRouteOverlayMapView
@synthesize delegate;

- (void)drawRect:(CGRect)rect {
         NSLog(@"mesagge");
        if ([self.delegate respondsToSelector:@selector(drawingSuccessful:)]) {
            [self.delegate drawingSuccessful:YES];
        }
    }

Класс, который принимает протокол:

.h file
#import "UICRouteOverlayMapView.h"

@class  UICRouteOverlayMapView;

@interface ItineraireViewController : UIViewController <MKMapViewDelegate, UICGDirectionsDelegate, CLLocationManagerDelegate, 
           DrawingDataDelegate> {

               UICRouteOverlayMapView *routeOverlayMapView;
}

    .m file
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    routeOverlayMapView = [[UICRouteOverlayMapView alloc] init];
    routeOverlayMapView.delegate = self;
}

-(void) drawingSuccessful:(BOOL)done{
    NSLog(@"it's done");
}

Теперь, что я делаю неправильно, потому что метод drawingSuccessful никогда не вызывается?

Я точно знаю, что метод

- (void)drawRect:(CGRect)rect {
         NSLog(@"mesagge");
        if ([self.delegate respondsToSelector:@selector(drawingSuccessful:)]) {
            [self.delegate drawingSuccessful:YES];
        }
    }

вызывается, потому что это отображается NSLog(@"mesagge"); .Помогите помочь

Я сделал отладку и установил точку останова в этой строке:

   if ([self.delegate respondsToSelector:@selector(drawingSuccessful:)])

и я заметил, что это недопустимое условие ... оно никогда не входит в скобки ... так что это не компилируется [self.delegate drawingSuccessful:YES];. Итак, что не так?

Ответы [ 3 ]

3 голосов
/ 12 октября 2011

Это происходит, вероятно, потому что когда вы выделяете UICRouteOverlayMapView, вызывается метод -drawRect:. Но делегат устанавливается после этой строки. Следовательно, делегат никогда не получает сообщение. В целом, делегат должен быть нулевым в то время. Проверьте, равен ли делегат нулю.

1 голос
/ 12 октября 2011

джордж

Замените этот метод, я уверен, что вы получите решение.

- (void)drawRect:(CGRect)rect 
{
    NSLog(@"mesagge");
    if ([self.delegate respondsToSelector:@selector(drawingSuccessful:)]) {
        [delegate drawingSuccessful:YES];
    }
}
1 голос
/ 12 октября 2011

Вид карты наложения маршрута уже отображается в вашем перо? По вашему мнению, didLoad вы создаете его новый экземпляр, устанавливаете его делегат, а затем ... ничего. Обычно вы добавляете его в свое подпредставление, если, как я уже сказал, оно уже не существует в вашем файле пера.

Если это так, либо установите выход в UICRouteOverlayMapView и подключите делегат в построителе интерфейса, либо в вашем viewDidLoad, установите делегат для любой переменной экземпляра, которую вы используете для представления фактического вида карты.

Это может быть просто вопросом удаления этой строки:

 routeOverlayMapView = [[UICRouteOverlayMapView alloc] init];

Если routeOverlayMapView уже указывает на ваш реальный вид.

Вы, вероятно, не вводите последнее утверждение if, потому что ваш delegate равен нулю. Сам оператор в любом случае является избыточным, так как метод требуется в вашем протоколе.

...