2009-07-03 16 views
12

में निर्मित UIToolBar आइटम को प्रोग्रामेटिक रूप से कैसे बदलें I इंटरफ़ेस बिल्डर में बनाए गए विभिन्न छवि बटनों के साथ टूलबार है।आईबी

मैं जब दबाया प्रोग्राम के रूप में एक गतिविधि सूचक के साथ बटनों में से एक को बदलने के लिए, और फिर मूल बटन वापस रख लेकिन जब गतिविधि पूर्ण करता है पीला सफेद से रंग बदलने में सक्षम होना चाहते हैं।

क्या यह आईबी निर्मित टूलबार के साथ संभव है या क्या मुझे पूरे टूलबार प्रोग्रामेटिक और कस्टम दृश्यों को बनाने की आवश्यकता है?

उत्तर

26

यहां एक उदाहरण है जो मैंने इसी तरह की स्थिति में किया था। मैं इंटरफ़ेस बिल्डर का उपयोग करके टूलबार बनाना चाहता था लेकिन बारबटन इटम्स में से एक को टॉगल करना चाहता था कि यह "चेक" किया गया था या नहीं। इस उदाहरण में, ध्यान देने योग्य कुछ महत्वपूर्ण चीजें हैं। एक चयनकर्ता परिभाषित checkUncheckClicked कहा जाता है कि है कि वहाँ

NSMutableArray *toolbarItems; 
IBOutlet UIToolbar *toolbar; 
NSUInteger checkUncheckIndex; 

जब मैं जाँच की स्थिति अद्यतन करना चाहते हैं, मैं इस समारोह फोन ... कृपया ध्यान दें: निम्नलिखित 2 सदस्य चर हेडर फाइल में वर्ग के लिए निर्धारित किए गए हैं कहा जाता है जब UIToolbar में विशेष बटन क्लिक किया जाता है। और यूआईटीयूबलबार को टूलबार में आईबीओलेट के रूप में स्थापित किया गया है।वैकल्पिक रूप से, आप UIBarButtonItem को एक आउटलेट के रूप में हुक कर सकते हैं और उस बटन के सूचकांक की पहचान करने के लिए अपने तर्क के रूप में उपयोग कर सकते हैं, या उस मामले के लिए, यदि आप समय के साथ चीजें नहीं बदलेंगे तो आप बटन की अनुक्रमणिका को हार्ड-कोड कर सकते हैं। अंत में, प्रोजेक्ट में शामिल किए गए वैकल्पिक के बीच वैकल्पिक रूप से एक check.png और unchecked.png है।

- (void)updateBarButtonItemChecked:(BOOL)checked { 
    if (toolbarItems == nil) { 
     toolbarItems = [[NSMutableArray arrayWithArray:toolbar.items] retain]; 
     checkUncheckIndex = -1; 

     for (NSUInteger i = 0; i < [toolbarItems count]; i++) { 
      UIBarButtonItem *barButtonItem = [toolbarItems objectAtIndex:i]; 
      if (barButtonItem.action == @selector(checkUncheckClicked)) { 
       favoriteIndex = i; 
       break; 
      } 
     } 
    } 

    if (checkUncheckIndex != -1) { 
     UIBarButtonItem *barButtonItem = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:checked ? @"checked.png" : @"unchecked.png"] 
                      style:UIBarButtonItemStylePlain target:self action:@selector(checkUncheckClicked)] autorelease]; 
     [toolbarItems replaceObjectAtIndex:checkUncheckIndex withObject:barButtonItem]; 

     toolbar.items = toolbarItems; 
    } 
} 

और, टूलबार इटम्स और टूलबार कक्षा के लिए आपके डेलोक में जारी किया जाना चाहिए।

आशा है कि इससे मदद मिलती है!

1

मुझे लगता है कि यह संभव होना चाहिए। आप या तो अपने व्यू कंट्रोलर क्लास में उस विशिष्ट बटन के लिए आईबीओटलेट बनाने का प्रयास कर सकते हैं, और आईबी से उस आउटलेट में बटन को कनेक्ट कर सकते हैं, या आप उस यूआईटीूलबार इंस्टेंस की आइटम प्रॉपर्टी का उपयोग कर सकते हैं (आपके पास इसका संदर्भ है, है ना? ?) और वहां उपयुक्त वस्तु ढूंढें, संशोधित वस्तुओं के साथ एक नया एनएसएआरएआर बनाएं, और उसे उस टूलबार.इटेम्स प्रॉपर्टी पर वापस सेट करें।

HTH

+0

बहुत उपयोगी, धन्यवाद। मैं इसे आज़माउंगा और आपको बता दूंगा कि यह कैसा चल रहा है। – frankodwyer

2

यहाँ दृष्टिकोण मैं इस्तेमाल किया यह पूरी तरह से उपकरण पट्टी का प्रबंधन करने के प्रोग्राम के इतना आसान लग रहा था है ....

आपके विचार नियंत्रक में घोषित रूप UIBarButtonItem आइटम का 1 या अधिक सेट संपत्ति आइटम भी UIToolbar संपत्ति के रूप में टूलबार घोषित करते हैं और हुकअप करते हैं। वस्तुओं को पकड़ने के लिए 1 या अधिक सरणी भी घोषित करें।

कार्यान्वयन viewDidLoad alloc में और उदाहरण के लिए अपने UIBarButtonItems सेट

 playButton = [[UIBarButtonItem alloc] 
     initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
    target:self 
action:@selector(handlePlayClick)]; 

लचीला बटन (संरेखण आदि के लिए) इस

flexButton1 =[[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
target:nil action:nil]; 

तरह की घोषणा की जाती अलग संभाल करने के लिए कई initMethods रहे हैं बटन टूलबार समर्थन के प्रकार। सभी उपरोक्त के समान वाक्यविन्यास का पालन करें। लक्ष्य ध्यान और लक्ष्य सेटिंग्स है। लक्ष्य: आमतौर पर स्वयं होगा, कार्रवाई उस कार्य का नाम है जिसे बटन ट्रिगर करना चाहिए।

आपके UIBarButtons को आवंटित करने के बाद उन्हें initWithObjects का उपयोग करके सरणी में जोड़ें।

तब उपकरण पट्टी करने के लिए बटन आवंटित करने के लिए आप कहेंगे

[toolbar setItems:<array name>]; 

न अपने कोड के अंत में अपने UIBarButtons और सरणियों dealloc भूल जाते हैं।

उम्मीद है कि इससे मदद मिलती है। अगर आपको और कोड चाहिए तो मुझे बताएं।

रिच डी

0

इस पर एक नोट - टूलबार आपके आइकन में कोई भी रंग डालेगा, इसलिए आप इसे पीले रंग में नहीं कर पाएंगे। इसके बजाए आपको "चालू" इंगित करने के लिए छवि आकार बदलने की आवश्यकता होगी।

वैकल्पिक रूप से आपको UIButtons के साथ अपने BarButtonItems लोड करना होगा (initWithCustomView का उपयोग करें) और बटन की छवि को उचित रूप से सेट करें।

HTH

0

प्रयास करें:

- (void)setTitle:(NSString *)title forItem:(int)item ofToolbar:(UIToolbar *)tb { 
    NSMutableArray *newItems = [tb.items mutableCopy]; 
    UIBarButtonItem *old = [newItems objectAtIndex:1], 
    *titled = [[UIBarButtonItem alloc] initWithTitle:title style:old.style target:old.target action:old.action]; 

    [newItems replaceObjectAtIndex:1 withObject:titled]; 
    tb.items = newItems; 

    [titled release]; 
} 
+1

नई इटम्स लीक के रूप में आप एक प्रतिलिपि बना रहे हैं। आपको इसे "tb.items = newItems;" के बाद जारी करना चाहिए कॉल करें, क्योंकि टूलबार इसे अपने आप बनाए रखेगा। – Kalle

1

स्विफ्ट के बाद से इन उत्तरों पोस्ट किए गए हैं

बहुत बदल गया है। यहां एक स्विफ्ट 2.0 समाधान है।

यह महत्वपूर्ण नहीं है कि मूल UIBarButtonItem जिसे आप बदल रहे हैं प्रोग्रामेटिक रूप से बनाया गया है। आपको केवल UIToolbar आउटलेट चाहिए। बाएं से दूसरी वस्तु को प्रतिस्थापित करने के लिए, यह करें:

var toolbarItems = self.toolbar.items 
let newItem = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "play") 
toolbarItems![1] = newItem 
self.toolbar.setItems(toolbarItems, animated: true) 
2

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

@IBAction func playandPause(sender: UIBarButtonItem) { // Here we are creating an outlet. Hook this up to the bar button item. 
    for (index, button) in toolbarItems!.enumerate() { // Enumerating through all the buttons 
     if button === sender { // === operator is used to check if the two objects are the exact same instance in memory. 
      var barButtonItem: UIBarButtonItem! 
      if mediaplayer.playing { 
       mediaplayer.pause() 
       barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Play, target: self, action: #selector(playandPause(_:))) 
      }else { 
       mediaplayer.play() 
       barButtonItem = UIBarButtonItem.init(barButtonSystemItem: .Pause, target: self, action: #selector(playandPause(_:))) 
      } 
      toolbarItems![index] = barButtonItem // Replace the old item with the new item. 
      break // Break once we have found the button as it is unnecessary to complete the rest of the loop 
     } 
    } 
} 
+0

अच्छा समाधान! हालांकि self.toolbar.setItems (टूलबार इटम्स, एनिमेटेड: सच) चरण गुम है और इसके बिना मुझे डर है कि यह काम नहीं करेगा। –

0

पूरे उपकरण पट्टी है कि आप आईबी (कि कहने के लिए, न कि व्यक्तिगत टूलबार आइटम है) में बनाया के लिए, एक IBOutlet बनाएँ:

@IBOutlet weak var toolbarThatYouMade: UIToolbar! 

इस व्यक्ति टूलबार आइटम की एक सरणी है, इसलिए यदि आप एक [0] सूचकांक के साथ सबसे बाईं ओर के सदस्य (उदाहरण के लिए) का उपयोग होगा:

toolbarThatYouMade.items![0].image = UIImage(named: "New Image") 

इस कोड को मान लिया गया है तो आप एक छवि अपनी संपत्ति में "नई छवि" नाम है।

फिर आप उस विशिष्ट आइटम तक पहुंचने के बिना टूलबार आइटम के लिए एक छवि परिवर्तन को ट्रिगर कर सकते हैं; उदाहरण के लिए, यदि आप मीडिया प्लेयर की तरह कुछ के लिए इसका इस्तेमाल कर रहे थे, तो आप
ए) रोकें/प्ले बटन स्वयं,
बी) स्टॉप बटन,
सी) जब आप हैं खिलाड़ी राज्य के परिवर्तन की अधिसूचना,
या
डी) कुछ और पूरी तरह से। (बहादुर बनो! बोल्ड बनो! कुछ और बनें जो 'बी' से शुरू होता है!)

+0

स्वरूपण @ फिटर-फर्नांडीस के लिए धन्यवाद। (मुझे आशा है कि मैंने सही तरीके से ऐसा किया है।) – clyrinkpress

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