Iphone: нераспознанный селектор отправлен на экземпляр и viewDidLoad не работает - PullRequest
0 голосов
/ 08 апреля 2011

Я разрабатываю приложение. Я использовал TabBar, и каждая вкладка имеет свой класс (FirstViewController, SecondViewController, ...) Также есть один AppDelegate.

Когда я запускаю программу, запускается первый класс. Когда я выбираю вторую вкладку, Secondview .xib работает, но «viewDidLoad» не работает. Когда я выбираю третью вкладку, это то же самое.

Я поместил несколько кнопок на третью вкладку, и когда я нажимаю на нее, у меня появляется

 > -[UIViewController testAuthentication:]: unrecognized selector sent to instance 0x5f16920
    2011-04-08 13:46:42.511 e-mars[19501:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController testAuthentication:]: unrecognized selector sent to instance 0x5f16920'

Вот код моих занятий

SecondViewController.h

#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController {
}
@end

SecondViewController.m

#import "SecondViewController.h"
@implementation SecondViewController
- (void)viewDidLoad {
    [super viewDidLoad];
NSLog(@"viewDidLoad de SecondViewController");

NSURL *url = [NSURL URLWithString: @"http://iosdevelopertips.com/images/logo-iphone-dev-tips.png"];
UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]]; 

[self.view addSubview:[[UIImageView alloc] initWithImage:image]];
}

- (void)dealloc {
    [super dealloc];
}

@end

ThirdViewController.h

#import <UIKit/UIKit.h>

@interface ThirdViewController : UIViewController {
IBOutlet UITextField *login;
IBOutlet UITextField *motdepasse;
NSMutableData *responseData;
}
@property (retain, nonatomic) UITextField *login;
@property (retain, nonatomic) UITextField *motdepasse;
@property (retain, nonatomic) NSMutableData *responseData;
- (IBAction) testAuthentication: (id)sender;
- (IBAction) saveAuthentication: (id)sender;
@end

ThirdViewController.m

#import "ThirdViewController.h"

@implementation ThirdViewController

@synthesize login;
@synthesize motdepasse;
@synthesize responseData;

- (id)initWithFrame:(CGRect)frame {
    //if ((self = [super initWithFrame:frame])) {
        // Initialization code
    //}
    return self;
}

-(IBAction) testAuthentication: (id)sender {
    //NSLog(@"testAuthentication");
}


- (IBAction) saveAuthentication: (id)sender {
    NSLog(@"saveAuthentication");
}
- (void)dealloc {
    [login dealloc];
    [motdepasse dealloc];
    [responseData dealloc];
    [super dealloc];
}
@end

Ответы [ 4 ]

1 голос
/ 08 апреля 2011

Ваш третий ViewController фактически не создает экземпляр, поэтому никакие методы экземпляра не могут быть вызваны для него.Исправьте свой метод initWithFrame:Помните: методы экземпляра начинаются со знака «-», методы класса начинаются со знака «+».

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithNibName:nil bundle:nil];
    if (self)) {
        // Initialization code
    }
    return self;
}

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 
{
    return [self initWithFrame:CGRectZero];
}

- (id)init 
{
    return [self initWithFrame:CGRectZero];
}

После того, как вы исправили это, по крайней мере, метод viewDidLoad в третьем ViewController должен работать.

Что касается второго ViewController, не могли бы вы показать код, который вы используете для создания экземпляра ViewController?

Редактировать: Я внес некоторые изменения, чтобы убедиться, initWithFrame: всегда вызывается при инициализации, на случай, если вы создадите экземпляр с использованием другого метода ( initWithNibName: bundle: или init ), теперь initWithFrame: стал назначенным инициализатором .

0 голосов
/ 09 августа 2011

В первый раз viewController будет поступать с viewDidLoad, после этого он не вызывает viewDidLoad, а вызывает viewWillAppear. так что вы можете кодировать все, что вы хотите в viewWillAppear.

0 голосов
/ 08 апреля 2011

Проверьте Object, на который вы звоните testAuthentication

Может быть, вы звоните testAuthentication на объект secondViewController, просто проверьте и дайте нам знать

0 голосов
/ 08 апреля 2011

Установить класс в Viewcontroller.

, а затем попробуйте.

...