Не удалось назначить self.delegate, это приведет к отправке нераспознанного селектора - PullRequest
4 голосов
/ 05 декабря 2010

Я новичок в iOS, и у меня проблемы с реализацией @ протокола , извините, если вы считаете, что это легко ...

Я искал в сети stackoverflow.com, на сайтах, а также некоторое время пробовал дядю Google, и я решил спросить здесь ...

Основная идея - вызвать MyViewController из TopViewController и сделать анимацию сальто Начну с создания протоколов ..

    // This is my Delegate header
    // MyViewController.h

    @protocol MyViewControllerlDelegate

    - (void) myViewControllerDidFinish;

    @end

    @interface MyViewController : UIViewController 
    {
     id <MyViewControllerlDelegate> delegate;
    }

    @property (nonatomic, assign) id <MyViewControllerlDelegate> delegate;

    - (IBAction) done;

    @end

и ниже находится на реализации:

    // MyViewController.m

    #import "MyViewController.h"

    @implementation MyViewController

    @synthesize delegate;

    // Another Code above

    - (IBAction)done 
    {
     [self.delegate myViewControllerDidFinish];
    }

    // Another Code Below

    @end

Я использую вышеуказанный объект для вызова из другого представления ниже и добавляю в него флип-переход:

// TopViewController.h

#import "MyViewController.h"

@class MapScrollView;

@interface TopViewController : UIViewController <UIScrollViewDelegate,MyViewControllerlDelegate> 
{
    UIScrollView *topScrollView;
    UIButton *infoButton;
}

@end

Реализация TopViewController.h //TopViewController.m

#import "TopViewController.h"
#import "CustomScrollView.h"
#import <QuartzCore/QuartzCore.h>

- (void)loadView 
{    
    // Step 1: make the outer paging scroll view
    CGRect topScrollViewRect = [[UIScreen mainScreen] bounds];
    topScrollView = [[UIScrollView alloc] initWithFrame:topScrollViewRect];
    topScrollView.pagingEnabled = YES;
    topScrollView.backgroundColor = [UIColor blackColor];
    topScrollView.showsVerticalScrollIndicator = NO;
    topScrollView.showsHorizontalScrollIndicator = NO;
    topScrollView.contentSize = CGSizeMake(topScrollViewRecte.size.width,
                                              topScrollViewRecte.size.height);
    topScrollView.delegate = self;
    self.view = pagingScrollView;

    CustomScrollView *sView = [[[MapScrollView alloc] init] autorelease];

    sView.frame = [[UIScreen mainScreen] bounds];

    [sView displayTiledMap];

    [pagingScrollView addSubview:sView];

    // add Info Button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeInfoDark];
    [button addTarget:self action:@selector(infoIsTouch:)   forControlEvents:UIControlEventTouchDown];
    button.frame = CGRectMake(282.0, 440.0, 18.0, 19.0);
    [self.view addSubview:button];
}

-(void)infoIsTouch:(id)sender
{
 MyViewController *myView = 
 [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
 myView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        //
        //Here where the code is crash 
        //
 [myView setDelegate:self];
        //
        //Code from here to below is not run...
        //
 [self presentModalViewController:myView animated:YES];
 [myView release];
}

- (void) myViewControllerDidFinish
{
 [self dismissModalViewControllerAnimated:YES];
}

etc... 

@end

Ниже кода выдает следующую ошибку компилятора.

2010-12-06 01:09:07.946 MyViewDelegatePractice[9473:207] -[TopViewController setDelegate:]: unrecognized selector sent to instance 0x5f30fb0
2010-12-06 01:09:07.949 MyViewDelegatePractice[9473:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TopViewController setDelegate:]: unrecognized selector sent to instance 0x5f30fb0'
*** Call stack at first throw:
(
    // Cuts... 
)
terminate called after throwing an instance of 'NSException'

Эти ошибки возникают, когда я нажимаю infoButton, который вызывает - (void) infoIsTouch: (id) метод отправителя, затем останавливается на строке [myView setDelegate: self] ... Может кто-нибудь подсказать мне, где мои ошибки? 1022 *

ПРИМЕЧАНИЕ: Если вы испытываете отвращение к моему английскому языку ... не стесняйтесь комментировать это также ... но до этого ... извините, я стараюсь изо всех сил ..

Ответы [ 3 ]

8 голосов
/ 17 мая 2012

Старая запись, но для тех, кто сталкивается с той же проблемой, убедитесь, что для класса в инспекторе удостоверений установлен правильный класс.Это была моя проблема.Наверное, самая забытая вещь в Xcode.

3 голосов
/ 05 декабря 2010

Вы @synthesize delegate; где-то? О, вот оно. Derp.

ОК - так - это ошибка во время выполнения. Будь прокляты предупреждения компилятора и т. Д. (Я имею в виду - определенно исправьте их, но компилятор генерирует код, который работает и дает сбой).

Нераспознанный селектор означает, что была предпринята попытка вызвать метод для объекта, где этот объект не отвечает на указанный метод. В этом случае обратная трассировка вряд ли будет очень полезна; Вы уже определили место падения и причины его сбоя.

Попробуйте установить точку останова на сбойной линии и затем использовать отладчик для опроса указанного объекта;

po object
po (id) [object class]
p (BOOL) [object respondsToSelector: @selector(setDelegate:)]

... и т. Д. *

Возможно, происходит что-то ужасно очевидное, но я не вижу этого случайно.

2 голосов
/ 05 декабря 2010

Я предполагаю, что у вас есть другая переменная с именем myView, которая перехватывает ваш вызов к экземпляру MyViewController, который вы только что создали.Попробуйте изменить имя этого экземпляра и посмотрите, что произойдет.

Прочие сведения: возможно, в вашей реализации опечатка MyViewController содержит опечатку.Измените эту строку:

@implementation FanglesMapSettingsViewController

на эту:

@implementation MyViewController

И вам должно быть хорошо идти.(Вы получаете эту ошибку, потому что заголовочный файл не соответствует какой-либо реализации, из-за опечатки, поэтому вы никогда не получите выгоду от вашего @synthesize delegate; вызова.

Также убедитесь, что вы объявилиправильный протокол в TopViewController:

@interface TopViewController : UIViewController <UIScrollViewDelegate, MyViewControllerlDelegate> 

И измените объявление протокола на:

@protocol MyViewControllerlDelegate<NSObject>

Кроме этого, все выглядит хорошо.

...