0

このリンクで Moshe のコードを試してみましたが、「for (UIButton *button in ...」の部分を除いて機能し、ボタンをクリックするたびにクラッシュします。

そこで、viewDidLoad メソッドで次のコードを試しました。

UIButton *testButton = [[UIButton alloc]initWithFrame:CGRectMake(20,50,30,30)];
    testButton.backgroundColor = [UIColor orangeColor];
    [testButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [testButton setTitle:@"A" forState:UIControlStateNormal];
    [testButton addTarget:self action:@selector(commonMethodForButtons:) forControlEvents:UIControlEventTouchDown];

    [self.view addSubview:testButton];
    [testButton release];

私のプロジェクトには、これと Moshe のサンプル コードしか含まれていません。アプリがクラッシュする理由はありますか? クラッシュログがありません。

編集:

オープンスコープには、次のメソッドがあります。

-(void)commonMethodForButtons:(id)sender
{
    NSLog (@"you touched me!");
}

編集2:

この問題の理由を見つけました:

私はAppDelegateでコメントアウトし[mvc release];たので、今では完全に機能します:)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    MVC *mcv = [[MVC alloc]initWithNibName:nil bundle:nil];

    [self.window addSubview: mcv.view];

    //[mcv release];

    [self.window makeKeyAndVisible];

    return YES;
}

ご指摘ありがとうございます!:)

4

2 に答える 2

1

プロパティとしてmcvを使用する

AppDelegateのヘッダーファイル:

@class MVC;
    @interface AppDelegate : UIResponder {
    MVC *mcv;
}

@property (nonatomic, retain) MVC *mcv;

実装ファイル内

@implementation AppDelegate

@synthesize mcv;

- (void)dealloc
{
    [mcv release];
    [super dealloc];
}
于 2012-07-22T13:08:41.090 に答える
0

いいえ、現在受け入れられている回答のように、コメントアウトして問題を解決するべきではありませ[mcv release]ん(これは、問題ではなく症状を修正するだけであり、ARCに変換した場合に問題を引き起こす可能性があります)また、現在受け入れられている回答のようにすべきではありません、アプリ デリゲートの ivar として保存されmcvますが (a) 設定に失敗しますが、(b) はまだ使用されます。アプリのデリゲートの. 現在のソリューションでは、View Controller 階層が正しく構成されません。次のようにする必要があります。mvcrootViewControlleraddSubviewrootViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    MVC *mvc = [[MVC alloc]initWithNibName:nil bundle:nil]; // really no NIB name?!?

    //[self.window addSubview: mvc.view];
    self.window.rootViewController = mvc;

    [mvc release];

    [self.window makeKeyAndVisible];

    return YES;
}

didFinishLaunchingWithOptionsまたは、非 ARC Xcode テンプレートによって生成された標準に準拠することをお勧めします。たとえば、次のようになります。

//  AppDelegate.h

#import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;

@end

//  AppDelegate.m

#import "AppDelegate.h"

#import "MVC.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[MVC alloc]initWithNibName:nil bundle:nil]; // really no NIB name?!?
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

このプロパティを参照する必要はありませんでしたがviewController、これが Xcode が生成するデフォルトのコードであることを考えると、これは良い習慣だと思います。

于 2012-07-24T15:28:51.797 に答える