2

次のようなIBActionがあります。

- (IBAction)showPicker:(id)sender;

送信者変数からコントロールの名前を取得するにはどうすればよいですか?

私は通常ac#コーダーなので、次のことを試しましたが無駄になりました

senderName = ((UIButton *)sender).name;

コントロールIDよりもわかりやすいものが必要です(ボタンのタイトルでもありません)。同じメソッドを呼び出すボタンが5つあります。適切なコントロールでメソッドアクションを実行するために、どちらがクリックされたかを判別する必要があります。IEアドレスピッカーメソッドがありますが、5つのボタンのそれぞれに異なる詳細を5つのテキストフィールドに入力したいと思います。コードを整理しようとしているだけです

NB当初、私はInterface Buildersの名前フィールドを使用することを計画していましたが、これは実行時に使用できないことを(以下で)アドバイスされています。

4

6 に答える 6

5

tagプロパティを使用して確認することをお勧めします。これは名前ではなく整数ですが、2 つのコントロールを区別するために使用できます。UIView から継承されるため、イベントを送信するすべてのコントロールにそれが必要です。

View attributes の下の Interface Builder で編集できます。

これはプロパティであるため、ドット表記を使用してプログラムからアクセスできます。

control.tag

または、次のように文字列に変換できます。

[stringWithFormat:@"%d", control.tag]
于 2008-12-11T13:42:26.657 に答える
3

Interface Builderでオブジェクトの名前を使用して、そのオブジェクトを参照することはありません。参考までにあります。(Interface Builderは、コントロールに接続するアウトレットとコントロールによって送信されるアクションの名前のヒントとしても使用しますが、ヒントとしてのみ使用します。)

代わりに、オブジェクトに接続するコントローラーオブジェクトにコンセントを追加します。これにより、ルックアップ手順を実行せずに、実行時にコントローラーからオブジェクトに直接アクセスできます。

また、5つのボタンがあり、5つの操作があり、すべて同じアクションメソッドに接続されているようです。そうしないでください。

CocoaおよびCocoaTouchでは、通常、「イベントごと」にアクションメソッドを作成してから、イベントを送信したコントロールに基づいて何をするかを決定するべきではありません。Cocoaのコントロールは、イベント自体を処理し、それらをより高いレベルのアクションに変換します。したがって、コントローラーに5つのアクションメソッドを実装し、各ボタンを適切なアクションメソッドに接続し、アクションを送信したコントロールに基づいて何をするかを決定する必要はありません。

明らかに、これはすべての場合に適切であるとは限りません。たとえば、実行時に画像が変化するボタンのマトリックスがある場合、それらすべてを同じアクションに接続し、タグプロパティに基づいて区別する必要があります。経験則として、「異なる」ものを処理する場合は異なるアクションメソッドを使用し、「同じ」ものの多くを処理する場合は同じアクションメソッドと制御タグを使用します。

于 2008-12-11T20:10:04.987 に答える
3

タグが多くの状況で機能することに同意しますが、特定したい場所でプッシュ可能な 100 個のボタンのマトリックスがある場合、整数タグを操作するのは面倒です: (1) 何が押されたか、(2) 押された値. 私は、手に負えなくなったタグ番号を使用して行/列の命名スキームを発明し始めていることに気付きました。

複数のコントロールで同じハンドラーを共有する必要があり、IB で UI を慎重に設計して、プッシュされたものに基づいて名前と値のペアをキーと値のストアに渡す必要がありました。

タグの代わりに、UISegmentedControl の別の回避策を思いつきました (他のコントロールでも機能します)。

(1) 新しいクラスとサブクラス UISegmentedControl を作成します。文字列プロパティ MyCustomKey を新しいクラスに追加します。

@interface CustomSegmentedControl : UISegmentedControl
@property (nonatomic, retain) NSString* myCustomKey; 
@end

(2) IB に戻り、UISegmentedContol インスタンスを CustomSegmentedControl のインスタンスに変更します。IB「ユーザー定義ランタイム属性」を使用して、IB を使用して myCustomKey の値を設定しました。KeyValueCoding がプロパティの設定を処理します。

インターフェイス構築によるカスタム プロパティの設定のスクリーン ショット

(3) すべてのボタンを単一の IBAction に接続します。

(4) IBAction では、カスタム属性を読み取ることでキーと値のペアを抽出できます。

- (IBAction)myButtonPressed:(id) sender
{
    if ([sender isKindOfClass:[CustomSegmentedControl class]] == false)
        return;

    // get the key-values from the control
    CustomSegmentedControl *control = (CustomSegmentedControl *)sender;
    NSString *key = [control valueForKey:@"myCustomKey"];
    NSNumber *value = [NSNumber numberWithInteger:[control selectedSegmentIndex]];
    NSLog(@"Pressed control %@ with a value of %@", key, value);
}

この場合、セグメント化されたコントロールの整数値にのみ関心がありましたが、コントロールから任意のプロパティを値として取得できました。

お役に立てれば。

于 2012-02-20T21:03:44.170 に答える
2

Interface Builder Identity の下のnameフィールドは、Interface Builder に固有のものです。実際にどのように使用されているのか正確にはわかりませんが、実際のコントロールで使用可能なプロパティ、ivar、またはメソッドにマップされません。代わりに、tagプロパティ (View 属性の下) を使用して、異なるコントロールをアクション メソッドと区別します (別の方法でそれらへの参照を ivar として保持しない場合)。私があなたを誤解していて、ボタンのタイトルが必要な場合は、currentTitle代わりに使用してください。

于 2008-12-11T13:36:37.853 に答える
0

コントロールに name 属性がある場合は、次のようになります。

NSString *senderName = [sender name];

これは、ほとんどのコントロールにあるものではありません。あなたが望むかもしれません:

NSString *senderName = [sender title];

たとえば、それが NSButton の場合。または、Marc が言うように、UIButton には currentTitle を使用します。

于 2008-12-11T13:41:06.393 に答える
0

試す:

senderTitle = [sender currentTitle];
于 2008-12-11T13:42:09.310 に答える