0

新しいプロジェクトを作成し、ビューにボタンが付いた新しいビューコントローラーを作成しました。

アプリケーションにビューを追加しています: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(code = 2エラーが発生します。何かアイデアはありますか?私はARCを使用しています。

ありがとう

アップデート

「introViewController」というアプリケーションデリゲートにパブリックプロパティを作成し、application: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;
}

これでエラーが解決しました。

4

1 に答える 1

0

IntroViewコントローラーを作成し、そのビューをサブビューとして追加していますが、コントローラー自体は解放されています。ビューコントローラーのビューを追加する(そしてARCにコントローラー自体を破棄させる)ことは、ビューを作成するための許容できる方法ではないと思います。

おそらく、IntroViewビューコントローラーをアプリデリゲートクラスのプロパティにすることができるため、ARCによってリリースされることはありません。

個人的には、アプリデリゲートによるビューとコントローラーの作成をいじくり回すのではなく、ターゲット設定とNIBに指示させます。イントロ画面が欲しいので、これをやっていると思います。画面が必要な場合は、メインのView Controllerを先に進めて、必要なイントロを表示します。そうすれば、イントロが閉じられたとき(または、モーダルでプッシュしたか提示したかによってはポップオフ)、メインのビューコントローラーがまだ一番上にあります(popToRootViewControllerなどの便利なメソッドは完全に機能します)。

于 2012-05-29T17:10:45.970 に答える