क्या UIButton शीर्षक / पाठ को प्रोग्रामिक रूप से अपडेट करना संभव है?


96

मेरे पास एक है UIButton, जिसे दबाने पर एक नया दृश्य सामने आता है जहां उपयोगकर्ता कुछ सेटिंग्स बदल सकता है। जब दृश्य खारिज हो जाता है, तो मैं UIButtonनए राज्य को प्रतिबिंबित करने के लिए शीर्षक / पाठ को अपडेट करना चाहूंगा । मै कॉल कर रहा हूँ:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

लेकिन यह मूल पाठ / शीर्षक से बदलने के लिए कभी नहीं जैसा कि आईबी में निर्दिष्ट है।


2
क्या आप सुनिश्चित हैं कि पोस्ट कोड कहा जा रहा है? क्या आपने यह साबित करने के लिए एक BREAKPOINT रखा था? क्या आप अपने प्रतिनिधि के हस्ताक्षर पोस्ट कर सकते हैं?
पाब्लो सांता क्रूज़

3
एक तरफ के रूप में, मेरा मानना ​​है कि आप एक साथ कई कंट्रोल स्टेट्स का संदर्भ दे सकते हैं: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication। UIControlStateHighlighted ... ...)]] तार्किक या ऑपरेटर (||) के विपरीत बिटवाइज़ या ऑपरेटर के उपयोग पर ध्यान दें। सामान्य तौर पर, जब आप इस तरह के राज्यों के साथ काम कर रहे होते हैं, तो आप उन्हें एक साथ या | ऑपरेटर। किसी ने मुझे गलत तरीके से सही किया है। :)
सिफिल्टर

काश, उनके पास UIControlStateAll: D
taber

2
IOS5 में बिटवाइज़ कॉम्बिनेशन मेरे लिए काम नहीं करता है।
एफिलॉन

एक ही मुद्दा यहाँ। IOS5 पर बिटवाइज संयोजन मेरे लिए काम नहीं करता है। / CC @LucasTizma
znq

जवाबों:


52

क्या आपके पास अपने दृश्य नियंत्रक वर्ग में एक IBOutlet के रूप में निर्दिष्ट बटन है, और क्या यह इंटरफ़ेस बिल्डर (एक नए संदर्भ आउटलेट से फ़ाइल स्वामी के लिए ctrl खींचें और अपनी UIButton ऑब्जेक्ट का चयन करने के लिए ctrl ड्रैग) के रूप में ठीक से जुड़ा हुआ है? जब मैं इन लक्षणों को देखता हूं तो आमतौर पर यही समस्या होती है।


संपादित करें: हालांकि यहां ऐसा नहीं है, ऐसा कुछ भी हो सकता है यदि आप बटन को एक जिम्मेदार शीर्षक सेट करते हैं, तो आप शीर्षक को बदलने की कोशिश करते हैं न कि शीर्षक को शीर्षक से।


4
बिंगो, यह वह था, धन्यवाद। मैं वास्तव में चाहता हूं कि उद्देश्य-सी सिर्फ इस तरह के मामलों में एक NullPointerException को फेंक देगा, बजाय चुपचाप ढोंग करते हुए कि एक शून्य ऑब्जेक्ट को संदेश भेजने के लिए ठीक है। यह मुझे लगभग दैनिक काटता है ... उह!
जॉर्ज आर्महोल्ड

20
ObjC nil को संदेश भेजने के लिए अपने ओके को 'दिखावा' नहीं करता है, क्योंकि यह nil को संदेश भेजने के लिए ठीक है ...
Jasarien

1
यहाँ मुद्दा एक शून्य सूचक नहीं है। मुद्दा यह है कि IB ने एक UIButton उदाहरण सेटअप किया है जिसे कोड (IBOutlet के माध्यम से) में ठीक से संदर्भित नहीं किया जा रहा है, इसलिए इसे प्रोग्रामेटिक रूप से कभी भी हेरफेर नहीं किया जा सकता है।
सिफिल्टर

112

मैंने केवल UIControlStateNormal के लिए शीर्षक पैरामीटर सेट करने में समस्या हल की, और यह स्वचालित रूप से अन्य राज्यों पर काम करता है। समस्या तब लगती है जब आप एक और UIControlState सेट करते हैं।

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];


13

मुझे एक और समस्या का पता चला। यह आईओएस 5 में पेश किया गया बग हो सकता है, लेकिन मुझे लगा कि मैं इसका सामना किसी और के लिए करूंगा, जो इसका सामना करता है।

यदि आप XIB में बटन के लिए कोई डिफ़ॉल्ट पाठ सेट नहीं करते हैं, तो कोई भी पाठ कभी प्रकट नहीं होगा यदि आप इसे प्रोग्रामेटिक रूप से सेट करते हैं। और यदि आप XIB में पाठ सेट करते हैं, तो आप बाद में जो भी प्रोग्राम बटन पर असाइन करते हैं, वह डिफ़ॉल्ट पाठ के आकार में छोटा हो जाएगा।

और अंत में, यदि आप अपने बटन के साथ दृश्य दिखा रहे हैं और फिर किसी अन्य दृश्य (जैसे एक्शनशीट) का आह्वान करते हैं और फिर उसे खारिज कर देते हैं, तो बटन जिसे आपने प्रोग्राम को सौंपा है, वह मिट जाएगा और बटन कैप्शन आपके द्वारा सेट किए गए पर वापस आ जाएगा XIB में।


1
मैंने इन तीनों व्यवहारों पर गौर किया है और यह निश्चित रूप से कष्टप्रद है।
पिस्सू

2
मेरे पास छंटनी का मुद्दा था (पाठ को प्रोग्राम से कुछ अधिक समय तक बदलना), इसलिए मैंने पाठ के अंत में अतिरिक्त रिक्त स्थान डाल दिया, जब मैं पाठ को लंबे शब्द में बदलता हूं तो उस स्थान को। मेरे लिए यही काम किया।
मैटॉर्ब

2
ऐसा प्रतीत होता है कि इसके लिए फिक्स विधि [_बटन सेटटाइटल: @ "शीर्षक" forState: UIControlStateNormal] का उपयोग करना है; सीधे _button.titleLabel.text संपत्ति तक पहुँचने के बजाय। विधि कॉल के साथ रहें और आपको शायद वही मिलेगा जो आप चाहते हैं।
रिमल

12

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

यदि आप UIButton का उपयोग करने के लिए एक छवि सेट करते हैं

- (void)setImage:(UIImage *)image forState:(UIControlState)state

यह शीर्षक को कवर कर सकता है। मैंने इसे कठिन तरीके से पाया और आप में से कुछ ने उसी कारण से इस पृष्ठ को पढ़ने की कल्पना की।

इसके बजाय इस विधि का उपयोग करें

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

बटन छवि के लिए और शीर्षक प्रभावित नहीं होगा।

मैंने इसे प्रोग्रामिक रूप से निर्मित बटन और एक .xib में निर्मित बटन के साथ परीक्षण किया



4

डॉक्स आपको जवाब बताता है! UIButton शीर्षक परिवर्तन को अनदेखा करेगा यदि इसमें पहले से ही उपयोग करने के लिए एक Attringed स्ट्रिंग है (Xcode इंटरफ़ेस बिल्डर का उपयोग करते समय आपको प्राप्त होने वाला डिफ़ॉल्ट प्रतीत होता है)।

मैंने निम्नलिखित प्रयोग किया:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

3

एक और संभावित कारण यह है:

यदि आप बटन का शीर्षक सेट करने का प्रयास करते हैं (id)initWithNibName: ... विधि करते हैं, तो आप बटन की संपत्ति अभी भी शून्य हो जाएंगे। इसे अभी तक यूआईबेटन को नहीं सौंपा गया है।

आपको यह सुनिश्चित करना चाहिए कि आप अपने बटन को एक विधि में सेट कर रहे हैं जैसे (void)viewWillLoadया (void)viewWillAppear, लेकिन आप संभवतः उन्हें देर से सेट नहीं करना चाहते हैं (void)viewDidAppear


2

कभी-कभी यह वास्तव में जटिल हो सकता है। आसान तरीका बटन को " रिफ्रेश " करना है!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

मुझे इससे समस्याएँ होती रहीं, इसका एक ही हल था कि एक चित्र और लेबल को यूबीटटन के साक्षात्कार के रूप में जोड़ा जाए। तब मुझे पता चला कि मुख्य समस्या यह थी कि मैं शीर्षक के साथ एक यूब्यूटॉन का उपयोग कर रहा था: एट्रिब्यूटेड। जब मैंने इसे प्लेन में बदल दिया, तो बस शीर्षक की स्थापना की।


1

@ फुफकार बिलकुल सही है। यहां आप देख सकते हैं कि आपको क्या आवश्यकता होगी सुनिश्चित करें कि फ़ंक्शन केवल मुख्य धागे पर चलता है । यदि आप थ्रेड्स के साथ सौदा नहीं करना चाहते हैं, तो आप उदाहरण के लिए ऐसा कर सकते हैं: NSUserDefaults बनाएं और ViewDidLoad में चेकिंग की स्थिति को किसी अन्य दृश्य में बटन दबाया गया था या नहीं (NSUserDefaults में एक और दृश्य सेट जानकारी की आवश्यकता है) और शर्तों के आधार पर सेट शीर्षक के लिए आवश्यक शीर्षक के आधार पर आपका UIButton, इसलिए [yourButton setTitle: @ "शीर्षक" forState: UIControlStateNormal];


यह मेरे लिए बहुत उपयोगी था। यदि आप सेटटिटल और सेटनैडिसप्ले को कॉल करते हैं, तो बैकग्राउंड थ्रेड से व्यू बहुत बाद में अपडेट हो जाएगा।
user1111828

0

सुनिश्चित करें कि आप मुख्य धागे पर हैं।

यदि नहीं, तो यह अभी भी बटन पाठ को बचाएगा। यह तब होगा जब आप डिबगर में ऑब्जेक्ट का निरीक्षण करेंगे। लेकिन यह वास्तव में दृश्य को अपडेट नहीं करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.