16

たとえば、変数をUIButtonアクションに渡したい

NSString *string=@"one";
[downbutton addTarget:self action:@selector(action1:string)
     forControlEvents:UIControlEventTouchUpInside];

そして私のアクション関数は次のようなものです:

-(void) action1:(NSString *)string{
}

ただし、構文エラーが返されます。変数をUIButtonアクションに渡す方法は?

4

8 に答える 8

21

次のように変更します。

[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];

Iphone SDKについてはわかりませんが、ボタンアクションのターゲットはおそらくID(通常は送信者という名前)を受け取ります。

- (void) buttonPress:(id)sender;

メソッド呼び出し内では、送信者がボタンである必要があります。これにより、名前、タグなどのプロパティを読み取ることができます。

于 2009-02-04T08:28:34.657 に答える
18

複数のボタンを区別する必要がある場合は、次のようなタグでボタンをマークできます。

[downbutton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
downButton.tag = 15;

アクション デリゲート メソッドでは、以前に設定したタグに従って各ボタンを処理できます。

(void) buttonPress:(id)sender {
    NSInteger tid = ((UIControl *) sender).tag;
    if (tid == 15) {
        // deal with downButton event here ..
    }
    //...
}

更新:sender.tagはaNSIntegerではなくaでなければなりませんNSInteger *

于 2010-06-14T14:16:09.857 に答える
6

連想参照を使用して、UIButtonに任意のデータを追加できます。

static char myDataKey;
...
UIButton *myButton = ...
NSString *myData = @"This could be any object type";
objc_setAssociatedObject (myButton, &myDataKey, myData, 
  OBJC_ASSOCIATION_RETAIN);

ポリシーフィールド(OBJC_ASSOCIATION_RETAIN)には、ケースに適切なポリシーを指定します。アクションデリゲートメソッドについて:

(void) buttonPress:(id)sender {
  NSString *myData =
    (NSString *)objc_getAssociatedObject(sender, &myDataKey);
  ...
}
于 2012-03-02T10:20:35.887 に答える
6

変数を渡すための別のオプションは、leviatan の回答のタグよりも直接的であることがわかりましたが、accessibilityHint で文字列を渡すことです。例えば:

button.accessibilityHint = [user objectId];

次に、ボタンのアクション メソッドで:

-(void) someAction:(id) sender {
    UIButton *temp = (UIButton*) sender;
    NSString *variable = temp.accessibilityHint;
    // anything you want to do with this variable
}
于 2013-12-22T12:39:12.793 に答える
1

UIButton を拡張してカスタム プロパティを追加できます

//UIButtonDictionary.h
#import <UIKit/UIKit.h>

@interface UIButtonDictionary : UIButton

@property(nonatomic, strong) NSMutableDictionary* attributes;

@end

//UIButtonDictionary.m
#import "UIButtonDictionary.h"

@implementation UIButtonDictionary
@synthesize attributes;

@end
于 2015-04-23T14:56:23.167 に答える
1

これを行う唯一の方法は、アクションを呼び出す前にインスタンス変数を設定することです

于 2009-05-29T13:53:47.517 に答える
0

ボタンのタグを設定し、アクションで送信者からアクセスできます

[btnHome addTarget:self action:@selector(btnMenuClicked:)     forControlEvents:UIControlEventTouchUpInside];
                    btnHome.userInteractionEnabled = YES;
                    btnHome.tag = 123;

呼び出された関数で

-(void)btnMenuClicked:(id)sender
{
[sender tag];

    if ([sender tag] == 123) {
        // Do Anything
    }
}
于 2014-09-12T16:42:50.137 に答える
0

使用していない UIControlStates の文字列を使用できます。

NSString *string=@"one";
[downbutton setTitle:string forState:UIControlStateApplication];
[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];

およびアクション関数:

-(void)action1:(UIButton*)sender{
    NSLog(@"My string: %@",[sender titleForState:UIControlStateApplication]);
}
于 2015-10-21T13:22:51.170 に答える