1

ストーリーボードにUISwitch要素を作成し、それを.hファイルに添付すると、コントローラーで次の行が生成されました。

@property (weak, nonatomic) IBOutlet UISwitch *wantHelp;

そして、値が変更されたときにシステムに通知する方法を見つけようとしていたので、元のステートメントの下に次のようなものを手動で追加しようとしました。

- (IBAction)wantHelp:(id)helpToggle;

コントローラーには、次のようなものがあります。

-(IBAction)helpToggle:(id)sender
{
    NSLog(@"sender is: %@", sender);

    if (wantHelp.on) 
    {
        NSLog(@"yes");
    }
    else 
    {
        NSLog(@"No");
    }
}

私がやりたかったのは、helpToggle IBActionを特定のUISwitch要素に接続することですが、それを実行すると、エラーが発生します。unrecognized selector sent to instanceこれは、私が理解しているように、間違ったオブジェクトに対して操作を呼び出したことを意味します。

誰かが私がここで間違っていることを理解するのを手伝ってもらえますか?

ありがとう!!

これは私の.mファイルがどのように見えるかです:

@interface PlanBusinessController ()

@end

@implementation PlanBusinessController
@synthesize businessDescription;
@synthesize personName;
@synthesize personEmail;
@synthesize privacy;
@synthesize wantHelp;


-(IBAction)helpToggle:(id)sender
{
    NSLog(@"sender is: %@", sender);

    if (wantHelp.on) 
    {
        NSLog(@"yes");
    }
    else 
    {
        NSLog(@"No");
    }
}
4

4 に答える 4

3

何が起こっているのかというと、UISwitchが呼び出すように指示されていますが、wantHelp:これを呼び出すメソッドが実装ファイル(.mファイル)に存在しないため、「インスタンスに送信された認識されないセレクター」エラーが呼び出されています。

于 2012-07-13T19:25:23.110 に答える
2

したがって、必要な数だけ持つことができますがIBAction、1つでも構いません。最も重要なのは、.hファイルでそれを宣言し、Interface Builderに入り、目的のアクションをそれにリンクすることIBActionです。だからあなたはあなたを持っていますIBAction

-(IBAction)WHATEVERNAME:(id)sender

次に、Interface Builderに移動し、ファイルの所有者オブジェクト(左上)をクリックします。次に、接続インスペクター(右上)をクリックし、WHATEVERNAMEと表示されているドットからオブジェクト(UISwitch wantHelp)にドラッグします。これを行うと、受信するアクションを尋ねられます。

理由(id)senderは、オブジェクトをキャストすることになっていることを覚えておいてください

UISwitch * tempSwitch = (UISwitch*) sender;

これは、スイッチオブジェクトへのポインタを取得できるようにするためです。これは、同じIBActionメソッドでさまざまな種類のオブジェクトを処理できるためです。


これはすべて良いことですが、実際のエラーは複数のセレクターが呼び出されたために発生しました。接続インスペクターに入ると、2つの異なるメソッドが接続インスペクターによって呼び出されているのを確認できました。1つは有効なIBActionで、もう1つは以前に宣言されたメソッドwantHelpでした。

于 2012-07-13T19:29:24.450 に答える
2

さて、すべての答えはあなたに「簡単な方法」を与えることができませんでした

コントロールを押したまま、ファイルUISwitchにドラッグし.hます。

次に、「接続」を選択できるダイアログボックスが表示されます。

ここに画像の説明を入力してください

この接続により、作成するのがIBOutletかIBActionかが決まります。

「アクション」に変更すると、イベントとして「ValueChanged」が自動的に選択され、任意の名前を付けることができます。

ここに画像の説明を入力してください

名前を付けましたhelpSwitchToggled。次に、.hファイルと.mファイルにIBActionがあります。

ここに画像の説明を入力してください

次に、.mファイルに、値が変更されたアクションのコードを記述できます。

ここに画像の説明を入力してください

コピー&ペーストの場合:

- (IBAction)helpSwitchToggled:(id)sender {

    if(self.helpSwitch.on)
    {
        //Do the On stuff
    } else {
        //Do the Off Stuff
    }

}

これは、インターフェイス上の何かに関連付けられたアクションを作成するための「簡単な方法」です。

IBActionとIBOutletの違いは他の回答でも指摘されていますが、基本的にアクションはコントロールイベントへの応答であり、アウトレットはビュー内の要素への接続です。

于 2012-07-13T19:51:54.870 に答える
1

IBActionは、InterfaceBuilderにそのアクションにアタッチできることを知らせるための単なるタグです。

IBActionはvoidとして定義されていますが、Interface Builderという名前を使用すると、接続をその上にドラッグして、オブジェクトからその関数にイベントを接続できます。

それ以外は、アクションには意味のある名前を付ける必要があります。helpToggleは私にはオンオフスイッチのようです。しかし、通常、そのメッセージにも少し説明を含めます。そのような

- (IBAction) helpSwitchToggled:(id) sender{
}

このメッセージは非常に意味のある名前を与え、それを読むことで、それを何と呼んでいるのか、そしてオブジェクトが送信しているメッセージのタイプを正確に知ることができます。

併せて、このように、helpSwitchと呼ばれるそのスイッチ用のIBOutletもあります。

@property (nonatomic, weak) IBOutlet UISwitch *helpSwitch;

ご覧のように。そのオブジェクトは明らかにスイッチです。そして、IBOutletは実際には何もないと定義されています。ただし、これもInterface Builderが使用するタグであり、InterfaceBuilderでリンクできるプロパティがあることを認識します。

IBActionとIBOutletは、これが可能な接続であることをInterfaceBuilderに通知するメタデータにすぎません。それらを接続するのはあなた次第であり、コンパイラはそれらを何もないように扱います。

この情報がお役に立てば幸いです:)

于 2012-07-13T19:35:28.277 に答える