Сбой в Main.m после нажатия кнопки - PullRequest
1 голос
/ 29 октября 2011

Я только начал создавать приложение, используя X-Code 4.2.Я создал приложение с шаблоном приложения с одним представлением.

Я создал MainIconViewController, который представляет собой простой VC, который содержит изображение, метку и кнопку.Я добавляю представление MainIconViewController в мое представление mainViewController, и при нажатии кнопки происходит сбой в Main.m, который говорит:

- [__NSCFType mainButtonPressed:]: нераспознанный селектор, отправленный экземпляру 0xb867ba0

Строка в Main.m, где происходит сбой:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

прямо сейчас buttonPressed: полностью пусто.

Есть идеи, как это исправить?

Я только что попытался создать целый новый проект, чтобы перепроверить это.Я создал проект, создал подкласс viewController, который содержал одну кнопку.Затем я создаю экземпляр этого представления в контроллере основного представления и добавляю его в представление.Когда я нажимаю кнопку, приложение вылетает, как и раньше.

РЕДАКТИРОВАТЬ: Вот весь код:

//MainIconViewController.h
@protocol MainIconViewControllerDelegate <NSObject>

-(void) openFileNamed:(NSString *)name;
-(void) createNewFile;

@end

#import <UIKit/UIKit.h>

@interface MainIconViewController : UIViewController {


}
@property (assign) id <MainIconViewControllerDelegate> delegate;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
- (void)mainButtonPressed:(id)sender;


@end


//////////////////////////////
//MainIconViewController.m
#import "MainIconViewController.h"

@implementation MainIconViewController
@synthesize titleLabel;
@synthesize imageView;
@synthesize delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [self setTitleLabel:nil];
    [self setImageView:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}
- (void)mainButtonPressed:(id)sender{

}

@end

Ответы [ 4 ]

0 голосов
/ 07 ноября 2011

Как вы создаете свой вид? Вы должны сделать это путем создания VC, затем доступа к представлению со свойством view или отображения контроллера представления в иерархии представлений.

MainIconViewController *vc = [[MainIconViewController alloc]initWithNibName:@"MainIconViewController" bundle:nil];
[self.view addSubview:vc.view];
// or....
[self presentModalViewController:vc animated:NO];

В противном случае соединения, которые вы выполняете в конструкторе интерфейсов, не будут соединяться с этим классом.

0 голосов
/ 30 октября 2011

Проверьте инициализацию этого контроллера представления.

0 голосов
/ 07 ноября 2011

Сначала ваш метод должен быть объявлен так:

- (IBAction)mainButtonPressed:(id)sender;

Тогда вы должны назвать свой контроллер следующим образом:

MainIconViewController *icon = [[MainIconViewController alloc]initWithNibName:@"your xib name without extension" bundle:nil];

(безопаснее, но это нормально, если ваш xib-файл назван как контроллер)

И, конечно же, не забудьте связать свою кнопку в IB с действием.

Проверьте также, что для File's owner (в IB) для xib, соответствующего MainIconViewController, установлено значение MainIconViewController.

Обратите внимание, что у вас есть утечка памяти. Вы можете оставить контроллер в своем классе и освободить его, когда он больше не нужен. Если выпустить слишком рано, произойдет сбой, потому что ваше представление не имеет контроллера в памяти, когда это необходимо. Если не освобожден (как здесь, вы делаете), контроллер продолжает оставаться в памяти, и у вас утечка памяти.

Обратите внимание, что Apple не рекомендует ваш способ (одна иерархия представлений = один контроллер представлений). Если вы используете ARC, это может быть проблемой вашего сбоя.

0 голосов
/ 29 октября 2011

Как сказано в выводе ошибок, вы не объявили метод mainButtonPressed: в своем заголовочном файле.

Убедитесь, что ваша подпись выглядит так:

- (void)mainButtonPressed:(id)sender;

в вашем заголовочном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...