方法委托不会被调用

时间:2011-10-12 10:08:19

标签: iphone objective-c ios delegates

我试图实现这个:

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 个答案:

答案 0 :(得分:3)

发生这种情况可能是因为当您分配UICRouteOverlayMapView时,会调用-drawRect:方法。但代表是在该行之后设置的。因此,代表永远不会收到消息。 总的来说,代表当时应该是零。检查代表是否为零。

答案 1 :(得分:1)

路线覆盖地图视图是否已经出现在您的笔尖中?在你的视图didLoad中,你正在创建它的一个新实例,设置它的委托,然后......没有。您通常会将其添加到子视图中,除非,正如我所说,它已经存在于您的nib文件中。

如果是,请在UICRouteOverlayMapView中设置出口并在界面构建器中连接委托,或者在viewDidLoad中,在您用于表示实际地图视图的任何实例变量上设置委托。

这可能只是删除这一行:

 routeOverlayMapView = [[UICRouteOverlayMapView alloc] init];

如果routeOverlayMapView已经指向您的真实视图。

您可能没有输入最后一句if语句,因为您的delegate为零。无论如何,语句本身是多余的,因为协议中需要该方法。

答案 2 :(得分:1)

乔治

替换此方法,我相信你会得到解决方案。

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