1

これは非常に奇妙に聞こえると思いますが、とにかく質問します。iPhone 用に複数の動作するアプリケーションを作成しましたが、元のビュー コントローラーにすべてを追加する必要があります。そうしないと、アプリがクラッシュします。これが私の例です:

ビューコントローラーで:

- (IBAction) someAction: (id) sender {
    NSLog(@"lajkrbgl");

}

これはうまくいきます。しかし、「ファイルの追加」を実行して「Objective-C クラス」を選択し、同じコードを挿入すると、ボタンを押すたびにアプリがクラッシュします。オブジェクトを追加して、OS X の場合と同じように機能させるにはどうすればよいですか?

編集:以下は、新しいオブジェクトを作成するために取った手順です。これらの手順は、OS X アプリケーションを作成するときに役立ちました。

  1. Xcode の「Classes」フォルダを右クリックしました。
  2. 「追加>新しいファイル」を選択しました。
  3. 「Objective-C Class」と「NSObject」を選択しました。
  4. 「- (IBAction) someAction: (id) sender;」というアクションを作成しました。
  5. Interface Builder で、アクションを UIButton に接続し、"Touch Up Inside" を使用しました。
  6. 「ビルドして実行」ボタンをクリックしました。

その後、ボタンをクリックすると、アプリケーションが終了しました (まるでホーム ボタンをクリックしたかのように)。エラーは発生しませんでした。次に、アクションのコードを入れなかったことが原因であると判断したので、次にそれを行いました。

- (IBAction) someAction: (id) sender; {
    NSLog(@"lajkrbl");
}

この後も、まったく同じ方法でクラッシュし、エラー メッセージも表示されませんでした。誰かが私が間違ったことを見ることができますか?

EDIT2:Xcode 4を実行したところです。ボタンをクリックすると、このコードが問題を引き起こしていることがわかりました(緑色の行の前に「**」を付けました)。

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    **int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;

}

一体どうしてそれがうまくいかなかったのですか?プロジェクトを作成すると、Xcode によって作成されます。

4

2 に答える 2

2

IBAction を個別のオブジェクトのメソッドに接続する場合、アクションが呼び出されるときにそのオブジェクトが存在する必要があります。IBAction コードを含むオブジェクトがインスタンス化され、ボタンを含むエンティティ (おそらくビュー コントローラー) によって保持されていることを確認してください。

これにより、エンティティが MyObject 型のインスタンス変数を保持することになる可能性があります。MyObject は、IBAction コードを含む NSObject サブクラスです。

コード例:

MyObject.m には以下が含まれます。

- (IBAction) someAction: (id) sender {
    NSLog(@"lajkrbgl");
}

MyViewController.xib には、TouchUpInside が someAction にリンクされている UIButton が含まれています。

MyViewController.h には以下が含まれます。

@interface MyViewController : UIViewController {
    MyObject *myObject_;
}

MyViewController.m には以下が含まれます (内initWithNibName:bundle:):

myObject_ = [[MyObject alloc] init];

オプションで myObject をプロパティにして、これをよりきれいにすることもできますが、それはあなた次第です。

于 2011-04-20T19:36:11.880 に答える