2010-01-22 6 views
12

पर विभिन्न पैरामीटर पास करें मेरे आईफोन ऐप में कई बटन हैं और मैं सभी बटनों को एक ही विधि को कॉल करना चाहता हूं, लेकिन विभिन्न मानकों के साथ।आईबीएक्शन

उदाहरण के लिए मैं तर्क के साथ विधि myMethod: पर कॉल करने के लिए एक बटन टैप करना चाहता हूं, और दूसरा बटन उसी विधि को कॉल करना चाहिए लेकिन तर्क @"bar" के साथ।

उत्तर

27

तथाकथित "IBActions" इन हस्ताक्षरों में से एक होना चाहिए:

-(void)action; 
-(void)actionWithSender:(id)sender; 
-(void)actionWithSender:(id)sender event:(UIEvent*)event; 

आप अन्य पैरामीटर को नहीं जोड़ सकते हैं। फिर भी आप sender उपयोग कर सकते हैं (जो आपके मामले में Button1 या Button2 है) पैरामीटर प्राप्त करने के लिए:

-(void)actionWithSender:(UIButton*)sender { 
    NSString* parameter; 
    if (sender.tag == 1) // button1 
    parameter = @"foo"; 
    else     // button2 
    parameter = @"bar"; 
    ... 
} 
+0

बिल्कुल सही! वास्तव में जिस उत्तर की मैं उम्मीद कर रहा था। धन्यवाद! – Quentamia

1

अपने विभिन्न UIButton उदाहरण tag संपत्ति मान अलग-अलग दें। आप इस बनाए रखने के लिए आसान बनाना चाहते हैं तो

- (void) myMethod:(id)sender { 
    switch (sender.tag) { 
     case (firstButtonTag): 
      doFooStuff; 
      break; 
     case (secondButtonTag): 
      doBarStuff; 
      break; 
     // etc. 
    } 
} 

मूल्यों firstButtonTag और secondButtonTag एक enum में संग्रहित किया जा सकता है:

अपने IBAction विधि -myMethod: में, आप तो जैसे कुछ करना हो सकता है।

1

आप एक IBAction के माध्यम से पैरामीटर पास नहीं कर सकते। मैं आमतौर पर जो करता हूं वह बटन आईबी में अद्वितीय टैग देता है। यह टैग एक पूर्णांक मान है, इसलिए मैं टैग को कुछ मूल्य में बदलने के लिए एक साधारण लुकअप तालिका का उपयोग करता हूं।

इस मामले में, तीन बटन लेकिन टैग 1 से 3:

- (IBAction) buttonPressed: (UIButton*) sender 
{ 
    static const NSString* names = { @"Foo", @"Bar", @"Baz" }; 
    id tag = [sender tag]; 
    if (tag >= 1 && tag <= 3) { 
     NSLog(@"Button pressed is %@", names[tag]); 
    } 
} 
-1

आप नहीं है। एकमात्र पैरामीटर प्रेषक ऑब्जेक्ट है, जिसका उपयोग आप एक अलग व्यवहार के लिए कर सकते हैं, लेकिन मैं जो करना चाहता हूं वह 2 क्रिया विधियों को परिभाषित करता है, जो बदले में उसी विधि को एक अलग पैरामीटर के साथ कॉल करते हैं, यानी आपके पास होगा:

- (IBAction)button1:(id)sender 
{ 
    [self doStuff:kButton1]; 
} 

- (IBAction)button2:(id)sender 
{ 
    [self doStuff:kButton2]; 
} 

- (void)doStuff:(ParamType)param; 
{ 
    ... 
} 

कि विधि की रक्षा में (कोई यमक इरादा), मैं जोड़ना होगा कि यह स्पष्ट करता है कि आप इंटरफ़ेस बिल्डर के साथ अपने यूआई की समीक्षा जब कि अलग बटन देखने के लिए वास्तव में जो कठिन है अगर बताने के लिए अलग अलग प्रभाव पड़ता है, वे सभी कॉल जो भी करें:

0

जैसा कि अन्य ने उल्लेख किया है कि आप अपने कस्टम पैरामीटर को एक्शन विधि में पास नहीं कर सकते हैं। यदि आपको टैग का उपयोग करके समाधान पसंद नहीं है तो आप अपनी कस्टम कक्षा के साथ UIButton को भी उपclass कर सकते हैं और वहां अपना पैरामीटर जोड़ सकते हैं। (मैं परेशान नहीं करता और केवल टैग का उपयोग नहीं करता)

2

वास्तविक कारण आप अतिरिक्त पैरामीटर नहीं जोड़ सकते हैं यह है कि UIKIT स्टैक पर पैराम को दबाएगा। इसलिए टैग का उपयोग करने का एकमात्र तरीका है। एक गंदा जिस तरह से यह साथ int करने के लिए एक सूचक और बटन टैगिंग कन्वर्ट करने के लिए किया जा सकता है:

myStruct params; 
// fill params: 
params.x=.... 
params.y=.... 
params.z=.... 


UIButton * btn = [UIButton......]; // create or use one from XIB 
btn.tag = (int)&params; 

... in Call back: 
-(IBActions) doIt:(id)sender 
{ 
    myStruct * paramsPtr = (myStruct*)tag; 
    int i = paramsPtr->x; 

नोट: पैरामीटर .. स्थिर रखने के किया जाना चाहिए या malloc का उपयोग कर (अधिक से अधिक बदसूरत कोड ...) का आवंटन। स्थानीय var का उपयोग न करें: इसे स्टैक पर आवंटित किया जाएगा ताकि सेटअप विधि से बाहर निकलने के बाद हटा दिया जाएगा।

+0

यह एक भयानक विचार है, और इसे सार्वजनिक मंच में अनुशंसा करना भी एक बुरा विचार है। –

1

(आईडी) प्रेषक यह दिखाता है कि जो भी आप यूआईबटन पर क्लिक करते हैं, क्लिक इवेंट सीधे इस विधि से गुजरता है और इससे कोई फर्क नहीं पड़ता कि यह किस प्रकार का है, यह स्वचालित रूप से लेता है जैसे कि आप बटन टैग पास करते हैं तो यह प्रेषक के रूप में बटन टैग लेता है। टैग आदि

संबंधित मुद्दे