方法委托不会被调用

方法委托不会被调用

问题描述:

我试图实现这个:方法委托不会被调用

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];。 那么,什么是错的?

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

如果有,请在UICRouteOverlayMapView中设置插座,并在界面构建器中或在viewDidLoad中连接委托,将委托设置为用于表示实际地图视图的任何实例变量。

这可能只是删除这条线的问题:

routeOverlayMapView = [[UICRouteOverlayMapView alloc] init]; 

如果routeOverlayMapView已经在你的真实看法指点。

你可能不进入,去年if语句,因为你的delegate为零。声明本身无论如何都是多余的,因为该方法在协议中是必需的。

+0

你是真的......我已经指向那个。我删除了这一行,并用下面的代码替换它:routeOverlayView.delegate = self;但仍然没有进入if语句! – adrian

+0

我不知道你需要的if语句(见我的更新),但什么是代表的价值,现在,当你在'drawRect'? – jrturton

+0

你是对的! – adrian

发生这种情况可能是因为当您分配UICRouteOverlayMapView时,将调用-drawRect:方法。但代表在该行之后。因此,代表从不接收消息。 总体而言,代表应该是零在那个时候。检查代表是否为零。

+0

这有什么解决方案? – adrian

+0

我们从不手动调用-drawRect:方法。相反,我们可以调用UIView的 - (void)setNeedsDisplay实例方法。它会要求系统重新绘制其视图内容。有关更多信息,请参阅此处的方法说明http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html – 2011-10-12 10:26:44

+0

显示的代码中的位置是george手动调用drawRect? – jrturton

乔治

更换这种方法,我相信你会得到解决。

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