2012-05-29 2 views
0

Создал новый проект и создал новый контроллер вида с кнопкой в ​​представлении.Нажатие на кнопку приводит к exe_bad_action

Я добавляю мнение в применении: didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 


    BOOL introDisplayed = [[NSUserDefaults standardUserDefaults] boolForKey:kIntroScreenSeenByUser]; 

    if(introDisplayed) 
    { 

    } 
    else 
    { 
     IntroView *introView = [[IntroView alloc] initWithNibName:@"IntroView" bundle:nil]; 
     [self.window addSubview:introView.view]; 
    } 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

.h файл

@interface IntroView : UIViewController 


@property (weak, nonatomic) IBOutlet UIButton *clickMe; 
- (IBAction)clicked:(id)sender; 

@end 

.m файл

#import "IntroView.h" 

@interface IntroView() 
@end 

@implementation IntroView 
@synthesize clickMe; 

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

- (IBAction)clicked:(id)sender { 
    NSLog(@"clicked"); 
} 
@end 

При нажатии на кнопку приводит в EXC_BAD_ACCESS (код = 2. Любые идеи? Я использую ARC.

Благодаря

UPDATE

создал общественную собственность на делегат приложения под названием "introViewController" и изменил применение: didFinishLaunchingWithOptions

@synthesize introViewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 


    BOOL introDisplayed = [[NSUserDefaults standardUserDefaults] boolForKey:kIntroScreenSeenByUser]; 

    introViewController = [[IntroView alloc] initWithNibName:@"IntroView" bundle:nil]; 
    if(introDisplayed) 
    { 

    } 
    else 
    { 
     [self.window addSubview:introViewController.view]; 
    } 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

Это решало ошибку.

ответ

0

Вы создаете свой контроллер IntroView и добавляете его в виде подвью, но сам контроллер освобождается. Я не думаю, что добавление представления контроллера представления (а затем разрешение ARC отказаться от самого контроллера) является приемлемым способом создания представления.

Возможно, вы можете сделать контроллер представления IntroView собственностью класса делегата приложения и, следовательно, он не будет выпущен ARC.

Лично я не обезьяна с созданием делегатов приложений и контроллеров приложения, но я позволю своим целевым настройкам и моим NIB диктовать это. Я предполагаю, что вы это делаете, потому что хотите иметь встроенный экран. Если бы мне нужен экран, у меня был бы мой главный контроллер представлений и представить все, что захочу. Таким образом, когда вступительное слово отклоняется (или выскакивает, в зависимости от того, что вы нажали или представили модально), мой главный контроллер просмотра все еще находится наверху (и полезные методы, такие как popToRootViewController, работают отлично).

+0

Спасибо за ответ. После прочтения вашего ответа я обновил код и разрешил ошибку. Благодарю. Я заблудился в сфере интроспекции и ARC. – iJK

+0

Да, я хочу включить экран, когда приложение загружается (только в первый раз). На экране ввода пользователь может щелкнуть по кнопке, чтобы войти в систему или зарегистрироваться, а после регистрации/регистрации я хочу загрузить контроллер панели вкладок с табличным представлением. Что вы рекомендуете в таком сценарии? Спасибо за подробное описание – iJK

+0

У меня будет мой viewDidLoad моего главного контроллера представления, чтобы определить, нужен ли этот экран ввода/входа, а затем представить этот контроллер вида (либо через модальный, либо нажав его, если вы используете навигационный контроллер). – Rob