Метод настроенного протокола не вызывает в iphone SDK - PullRequest
0 голосов
/ 10 марта 2012

У меня есть 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];

}

Кто-то из парней подскажет мне, как решить эту проблему и что я сделал не так.

Чья-либо помощь высоко ценится.

Спасибо всем, Мониш.

1 Ответ

1 голос
/ 13 марта 2012

Ошибка, которую вы получаете, довольно проста.Это означает, что вы отправляете сообщение -deleteWptFromRouteAndAppWithUID экземпляру RouteSelectController, и этот класс не имеет этого метода.Некоторые вещи для рассмотрения:

  • правописание: Если вы считаете, что вы определили этот метод в этом классе, внимательно проверьте правильность написания имени метода, чтобы убедиться, чточто метод, который вы вызываете, точно соответствует имени метода, который вы реализовали.Это довольно длинное имя, и было бы легко ошибиться.Помните, что учитывается и заглавная буква, и двоеточие (или отсутствие двоеточия).

  • получатель: Убедитесь, что объект, который получает сообщение, действительно является объектом, который выпредназначена.Это сообщение иногда появляется, когда у вас неверный указатель, что приводит к ошибочной идентификации.

Похоже, что это вторая проблема, которая возникает в вашем случае - выу нас есть реализация метода в MapViewController, но сообщение об ошибке указывает, что это сообщение отправляется экземпляру другого класса (RouteSelectController).Возможно, вы где-то явно меняете делегат RouteInfoController в своем коде, так что поищите это.Но может случиться так, что ваш объект делегата RouteInfoController по какой-то причине был освобожден, и впоследствии RouteSelectController создается по тому же адресу.Когда это происходит, delegate указывает на правильное место, но теперь там находится не тот объект, и возникает ошибка.

...