سؤال

وأريد أن تمرير متغير لعمل UIButton، على سبيل المثال

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

وظيفة عمل بلدي مثل:

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

ومع ذلك، تقوم بإرجاع خطأ في بناء الجملة. كيفية تمرير متغير لعمل UIButton؟

هل كانت مفيدة؟

المحلول

وتغييره لقراءة:

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

وأنا لا أعرف عن SDK فون، ولكن الهدف من عمل زر ربما يتلقى معرف (عادة يدعى المرسل).

- (void) buttonPress:(id)sender;

وضمن استدعاء الأسلوب، يجب أن يكون المرسل الزر في الحالة الخاصة بك، مما يتيح لك قراءة خصائص مثل عليه اسم، علامة، وما إلى ذلك.

نصائح أخرى

إذا كنت بحاجة إلى التمييز بين أزرار متعددة، ثم هل يمكن بمناسبة الأزرار الخاصة بك مع العلامات مثل هذا:

[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 ..
    }
    //...
}

وUPDATE: يجب أن تكون sender.tag على NSInteger بدلا من NSInteger *

ويمكنك استخدام <لأ href = "https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocAssociativeReferences.html#//apple_ref/doc/uid/TP30001163- CH24-SW3 "يختلط =" noreferrer "> المراجع النقابي لإضافة بيانات التعسفي 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);
  ...
}

وثمة خيار آخر لتمرير المتغيرات، التي أجد أن تكون أكثر مباشرة من العلامة من الإجابة 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
}

ويتم تعيين الطريقة الوحيدة التي وجدتها للقيام بذلك متغير مثيل قبل استدعاء الإجراءات

ويمكنك تمتد 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

ويمكنك تعيين سمة من زر والوصول إليه من المرسل في العمل

[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
    }
}

ويمكنك استخدام سلاسل من UIControlStates أنك dot'n الاستخدام:

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]);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top