自定义协议的方法不是在iphone sdk中调用

时间:2012-03-10 07:48:42

标签: iphone objective-c ios5 protocols

我正在使用RouteSelectController从中导航到RouteInfoController。

-(void)GoToRouteInfo
{
    RouteInfoController *controller = [[RouteInfoController alloc] initWithNibName:@"RouteInfoController" bundle:nil];

controller.delegate = self;
[self.navigationController pushViewController:controller animated:YES];
[controller release];
}

在RouteInfoController.h中我正在创建自定义协议,如

#import <UIKit/UIKit.h>
@protocol RouteInfoDelegate;
@interface RouteInfoController : UIViewController<UITableViewDelegate, UITableViewDataSource, WptInfoDelegate>
{

    id<RouteInfoDelegate> delegate;
}
@property (nonatomic, assign) id delegate
@end

@protocol RouteInfoDelegate

- (void) deleteWptFromRouteAndAppWithUID;

@end

在RouteInfoController.m中,我将此委托方法称为:

#import "MapViewController.h"
@class MapViewController;
@implementation RouteInfoController
@synthesize delegate;

-(void)callRouteDelegateMethod
{
  [self.delegate deleteWptFromRouteAndAppWithUID];
}

此方法的定义在MapViewController.m中,如:

#import "RouteInfoController.h"
@interface MapViewController () <UIScrollViewDelegate,RouteInfoDelegate>
{
    //.....................................
}

-(void) deleteWptFromRouteAndAppWithUID // The problem here is this delegate method is not called
{
    NSLog(@"\n Inside delete Way point...");

}

编辑:当控件到达

中的委托方法时
  

- (无效)callRouteDelegateMethod

在RouteInfoController中的

我在我的控制台中收到崩溃消息,如:

  

[RouteSelectController deleteWptFromRouteAndAppWithUID]:无法识别   选择器发送到实例0x6eb4eb0

EDIT2:

在RootInfoController中我有一个方法,在表视图的任何单元格的didselect上调用这个方法

- (void) viewWptInfoControllerAtIndex: (int)index{

    WptInfoViewController *controller = [[WptInfoViewController alloc] initWithNibName:@"WptInfoViewController" bundle:nil];
    controller.asRootController = NO;
    controller.delegate = self;
    NSMutableDictionary *dict = [route.routeWaypoints objectAtIndex:index];
    NPLibWaypoint *libWpt = [NPLibWaypoint initWithDictionary:dict AndDelegateDS:delegateDS];
    controller.libWpt = libWpt;
       [libWpt release];
    controller.isFromRouteInfo = YES;
    [self.navigationController pushViewController:controller animated:YES];
    [controller release];

}

盖伊的cpls有人建议我如何解决这个问题以及我做错了什么。

任何人的帮助都得到了极大的赞赏。

全部谢谢, Monish。

1 个答案:

答案 0 :(得分:1)

你得到的错误非常简单。这意味着您将消息-deleteWptFromRouteAndAppWithUID发送到RouteSelectController的实例,并且该类没有该方法。有些事情需要考虑:

  • 拼写:如果您认为已在该类中定义了该方法,请仔细检查方法名称的拼写,以确保您调用的方法完全匹配您已实现的方法的名称。这是一个很长的名字,很容易出错。请记住,大写与结肠(或缺少结肠)一样重要。

  • receiver:检查接收邮件的对象是否确实是您想要的对象。当你有一个错误的指针时,这个消息有时会出现,导致一个错误的身份。

看起来这是你问题的第二点 - 你已经在MapViewController中实现了该方法,但错误消息表明该消息正被发送到另一个类的实例(RouteSelectController) )。您可能正在代码中的某处显式更改RouteInfoController的委托,因此请查找。但可能是您的RouteInfoController的委托对象由于某种原因被解除分配,并且随后在同一地址处创建了RouteSelectController。当发生这种情况时,delegate指向正确的位置,但现在存在错误的对象,并且会出现错误。