iOS ऐप: मल्टीकंपोनेंट पिकर के साथ काम करना



यह ब्लॉग एक ios ऐप बनाने के बारे में है जो एक इकाई से दूसरी इकाई में रूपांतरण प्रदर्शित करता है। इसमें एक म्यूटिलोम्पोनेंट पिकर, अलर्ट्स आदि के काम का वर्णन किया गया है।

पूरी जानकारी हासिल करने के लिए, कृपया पढ़ें । यह ios ऐप सीरीज़ का दूसरा ब्लॉग है।





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

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



इस समस्या को हल करने के लिए हमें एक बटन जोड़ना होगा जो पूरे दृश्य को कवर करता है। जब उपयोगकर्ता पृष्ठभूमि पर कहीं भी स्पर्श करता है, तो कीबोर्ड गायब हो जाना चाहिए।

अब, आगे बढ़ो और इसे करो। एक बटन खींचें, बटन के प्रकार को कस्टम इंस्पेक्टर से स्पष्ट रंग के रूप में कस्टम और टेक्स्ट रंग के रूप में सेट करें।

गुण निरीक्षक



और संपादक का चयन करें> व्यवस्था करें> वापस भेजें

और बटन को इस तरह से आकार दें कि यह पूरे दृश्य को फिट करे।

उदाहरण के लिए चर को जावा में कहां घोषित किया जाना चाहिए

यह बटन अब एक पृष्ठभूमि अदृश्य बटन के रूप में कार्य करता है जो कीबोर्ड के गायब होने के लिए क्लिक किया जाता है। आइए इसके लिए IBAction लिखें, सहायक संपादक मोड का चयन करें और ViewController.h पर नियंत्रण + खींचें। कनेक्शन को एक्शन और नाम को बैकबटन पर सेट करें और कनेक्ट पर क्लिक करें।

व्यू कंट्रोलर कोड अब इस तरह दिखता है।

#import @interface ViewController: UIViewController @property (मजबूत, नॉनटोमिक) IBOutlet UITextField * ValueTextField @property (मजबूत, नॉनटोमिक) IBOUTlet UIPickerView * picker2 @property (मजबूत, नॉनट्रीम) डेटा @property * डेटा @property * data@property * डेटा प्रोपर * - (आईबीए जंक्शन) कन्वर्ट: (UIButton *) प्रेषक - (आईबीए जंक्शन) पृष्ठभूमि बटन: (आईडी) प्रेषक

ViewController.m पर स्विच करें और फिर निम्नलिखित कोड लिखें।

- (आईबीए जंक्शन) पृष्ठभूमिबटन: (आईडी) प्रेषक {[_ValueTextField resignFirstResponder] [_picker2 resignFirstResponder] [_ResultLabel resignstirstResponder]}

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

- (शून्य) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) पंक्ति inComponent: (NSInteger) घटक {चयनितValue = _data (पंक्ति) [आत्म पृष्ठभूमिबटन: 0]}}

अब, आप ऐप के सौंदर्यीकरण हिस्से पर काम कर सकते हैं, जैसे कि एक पृष्ठभूमि जोड़ना और शायद एक फैंसी बटन छवि भी देना। हालांकि, मेरा में, मैं एक पृष्ठभूमि छवि स्थापित करूंगा।
ऐसा करने के लिए, पहले एक उपयुक्त छवि ढूंढें! फिर इसे फ़ोल्डर Images.xcassets में जोड़ें और 1x से 2x स्क्रीन में यूनिवर्सल में छवि बदलें।

ऐप चलाएं और देखें कि क्या यह ठीक काम करता है।

अगर मैं डिवाइस को iphone 5s में बदलता हूं।

और ऐप चलाएं।

यहाँ हम देख सकते हैं कि सब कुछ ठीक काम करता है। अब क्या होगा अगर मैं अपने बटन में बैकग्राउंड जोड़ना चाहता हूं और उपस्थिति को बटन की तरह बनाना चाहता हूं? ऐसा करने के लिए, मैं सबसे पहले ViewController.h में कन्वर्ट बटन के लिए एक IBOutlet जोड़ूंगा

@property (मजबूत, गैर-परमाणु) IBOutlet UIButton * कन्वर्ट

और फिर viewDidLoad () विधि में निम्न कोड जोड़ें

self.convert.backgroundColor = [UIColor colorWithRed: 0.4 हरा: 0.8 नीला: 1.0 अल्फा: 1.0] [_convert setTitleColor: [UIColor whiteColor] forState: UIColorrolStateNormal]

आइए हम अपना ऐप चलाएं और देखें, अगर यह हमें पसंद है।

ठीक है अच्छा है! आपने देखा होगा कि मैंने परिणाम लेबल की स्थितियों को भी बदल दिया है, परिवर्तन का कारण कुछ है जिसे मैं बाद में समझाऊंगा।

हम जानते हैं कि हमारा ऐप केवल सेल्सियस से फ़ारेनहाइट और विसे-वर्सा में परिवर्तित होता है। तो, परिवर्तित करने के लिए कुछ और फ़ंक्शन या इकाइयों को कैसे जोड़ा जाए? ऐसा करने के लिए, हमें एक और घटक को UIPickerView में जोड़ना होगा जो उपयुक्त चयन देता है, जब एक इकाई को पिकर के पहले घटक में चुना जाता है।

एक पिकर को दो घटकों में विभाजित करने के लिए, हमें एक नया NSArray data2 जोड़ना होगा, जो दूसरे घटक के लिए डेटा रखेगा। इसके अलावा, दो स्थिरांक को परिभाषित करें जो हमारे दो घटकों का प्रतिनिधित्व करेंगे। यहां, बाएं घटक को 0 घोषित किया गया है और प्रोग्रामिंग की सरलता के लिए दायां घटक 1 घोषित किया गया है।

आपकी ViewController.h फ़ाइल की तरह दिखता है

#import # परिभाषित data1comp 0 # परिभाषित करें data2comp 1 @interface ViewController: UIViewController @property (मजबूत, गैर-परमाणु) IBOutlet UITextField * ValueTextField ... (मजबूत, गैर-परमाणु) IBOutlet UIPickerView * picker2 @property (# मजबूत) strong, nonatomic) NSArray * data2 @property (मजबूत, nonatomic) IBOutlet UILabel * ResultLabel @property (मजबूत, गैर-परमाणु) IBOutlet UIButton * परिवर्तित (IBAction) कन्वर्ट: (UIButton *) प्रेषक - (IBAction) पृष्ठभूमिबटन (आईडी) @समाप्त

अब ViewDidLoad () विधि में array data2 को परिभाषित करें। अब जब हमारे पास दोनों डेटा स्रोत हैं, तो हमें पिकर के लिए इस तरह से कोड लिखने में सक्षम होना चाहिए कि जब हम पिकर के पहले घटक से एक आइटम का चयन करें, तो दूसरा घटक स्वचालित रूप से संबंधित मान में बदल जाए। दूसरा घटक पहले के चयन पर निर्भर है।
इसके लिए, हमें एक शब्दकोश को परिभाषित करने की आवश्यकता है जो कुंजियों और मूल्यों को संग्रहीत करेगा। कुंजी में पिकर के पहले घटक के अनुरूप डेटा होता है, और मान में पिकर के दूसरे घटक के अनुरूप डेटा होता है।

- (शून्य) viewDidLoad {[सुपर viewDidLoad] // आम तौर पर एक नीब से, दृश्य लोड करने के बाद कोई अतिरिक्त सेटअप करें। _data1 = [NSArray arrayWithObjects: @ 'सेल्सियस', @ 'फ़ारेनहाइट', @ 'मीटर', @ 'सेंटीमीटर', nil] data2 = [NSArray arrayithithObjects: @ 'सेंटीमीटर', @ 'मीटर', @ 'फ़ारेनहाइट'। 'सेल्सियस', nil] शब्दकोश = [NS सहृदय शब्दकोशWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'मीटर', @ 'Centimeter', @ 'मीटर'। ', nil] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ')]]}}

अब, हमें वर्तमान पिकर के डेटा स्रोत और प्रतिनिधि तरीकों को निम्न में बदलना होगा, ताकि हमारे पास दोनों घटकों में डेटा भरा हो।

- (NSInteger) numberOfCompordsInPickerView: (UIPickerView *) pickerView {वापसी 2} - (NSInteger) pickerView: (UIPickerView *) pickerView number.fRowsInComponent: (NSInteger) घटक {अगर (घटक == data1comp) [self.data2 count]} - ((NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) पंक्ति forComponent: (NSInteger) घटक {if (घटक == data1comp) {वापसी [self.data1 objectAtIndex: row] वापसी [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) पंक्ति inComponent: (NSInteger) घटक {[self backgroundButton: 0] if (घटक == data1comp) data11 = [_ data1 objectAtIndex: row] NSArray * a = [शब्दकोश objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 indexRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponline.com: data_computer.com पर ईमेल करें। = पंक्ति}}

यहाँ हमारे doSelectRow () पद्धति में, हमें पहले घटक का चयनित मान मिल रहा है, फिर हम इसे डिक्शनरी फॉर ऑब्जेक्ट (डिक्शनरी ऑफ़ डिक्शनरी) के तर्क के रूप में पास करते हैं, और कुंजी के लिए संबंधित मान प्राप्त करते हैं। दूसरे एरे यानी डेटा 2 में मान के लिए संबंधित स्थिति ज्ञात करने के लिए, हम एरे के इंडेक्सऑफबजेक्ट () विधि का उपयोग करते हैं और परिणाम को पूर्णांक मान में संग्रहीत करते हैं।
हम फिर इस पूर्णांक मान को पिकर विधि के पास करते हैं चयन करें: पंक्ति inComponent: घटक () विधि। और पुनः लोडकंपोनेंट () का उपयोग करके पिकर के घटक को पुनः लोड करें।
एक बार जब हम ऐसा कर लेते हैं, जैसा कि हम पहले घटक से एक आइटम का चयन करते हैं, तो संगत आइटम को पिकर के दूसरे घटक में चुना जाएगा।

कोड के लिए didSelectRow ()

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) पंक्ति inComponent: (NSInteger) घटक {[self backgroundButton: 0: if (घटक == data1comp) {NSString * data11 = [_ data1 objectAtIndexx पंक्ति: a = [शब्दकोश objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [__icker2 reloadComponent: data2comp] चयनितValue = data11 चयनित पंक्ति = पंक्ति}।

अब ऐप चलाएं और देखें, अगर पिकर काम करता है जैसा कि अपेक्षित है।

वोइला! यह काम करता है!

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

- (IBAction) कन्वर्ट: (UIButton *) प्रेषक {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) स्विच (सिलेक्ट किया गया) (केस 0): C सेल्सियस से फ़ारेनहाइट रेस = (वैल *) 1.8) + 32ब्रेक केस 1: // फ़ारेनहाइट से सेल्सियस रिज़ = (वैल -32) / 1.8ब्रेक केस 2: // मीटर से सेंटीमीटर रेस = वैल * 100 ब्रेक केस 3: // सेंटीमीटर से मीटर रेस = वैल * 0.01 ब्रेक डिफ़ॉल्ट: Res = 0.0} NSString * अंतिम = [NSString stringWithFormat: @ '%। 02f', Res] _ResultLabel.text = अंतिम}

यदि आप ऐप चलाते हैं, तो हम देख सकते हैं कि सब कुछ ठीक है।

अब, हम उन अपवादों की जांच कर सकते हैं जो हमारे ऐप में हो सकते हैं। उदाहरण के लिए, टेक्स्ट बॉक्स में कोई मूल्य नहीं है। या हम सेल्सियस से मीटर या सेंटीमीटर में बदलने की कोशिश कर रहे हैं, जो वास्तव में संभव नहीं है। इस प्रकार की स्थिति को अपवाद कहा जाता है और हमें ऐसी त्रुटियों को संभालने के लिए कोड लिखकर इससे बचना चाहिए।

आइए हम उस प्रकार की त्रुटि को हल करें जो हमारे अनुप्रयोग को चलाने पर हो सकती है। यही है, हम टेक्स्टफील्ड में परिवर्तित होने के लिए अपना मान लिखने से चूक जाते हैं। इस परिदृश्य के लिए, हमें अपने उपयोगकर्ताओं को मूल्य दर्ज करने और फिर आगे बढ़ने के लिए सतर्क करना चाहिए।

हम इसके लिए UIAlertView का उपयोग कर सकते हैं। हम showAlertWithMessage (NSString *) संदेश नामक एक विधि लिख सकते हैं। इस पद्धति में, हम एक चेतावनी दृश्य की घोषणा कर सकते हैं और फिर इसे शो () विधि का उपयोग करके प्रदर्शित कर सकते हैं। विधि के लिए कोड निम्नानुसार होगा।

- (शून्य) showAlertWithMessage: (NSString *) संदेश {UIAlertView * alertView = [[UIAlertView आबंटित] initWithTitle: @ 'त्रुटि' संदेश: संदेश प्रतिनिधि: स्वयं रद्द करेंबटनटाइटल: nil otherButtonTives: @ 'OK', nilView _ResultLabel.text=@'No परिणाम '[अलर्ट देखें शो]}

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

- (IBAction) कन्वर्ट: (UIButton *) प्रेषक {अगर ([_ ValueTextField.text लंबाई]<= 0) { [self showAlertWithMessage:@' Please enter the value'] } else { float res=0.0 float val=[_ValueTextField.text floatValue] NSLog(@'value %f',val) switch(selectedRow) { case 0:// Celsius to Fahrenheit res=(val*1.8)+32break case 1: // Fahrenheit to Celsius res=(val-32)/1.8break case 2: // meter to centimeter res= val*100 break case 3://centimeter to meter res=val*0.01 break default: res=0.0 } NSString *final= [NSString stringWithFormat:@'%.02f',res] _ResultLabel.text = final } }

अब ऐप को चलाएं और टेक्स्टफील्ड में मान दर्ज किए बिना कन्वर्ट बटन पर क्लिक करने का प्रयास करें।

दूसरा प्रकार जो अपवाद हो सकता है, यदि पहला घटक में मूल्य UIPickerView के दूसरे घटक में मूल्य के साथ मेल नहीं खाता है। इसके लिए, हम जाँचते हैं कि क्या दूसरे चयनित घटक का वर्तमान चयनित घटक पंक्ति मूल्य, विधि के डीडसेट () प्रतिनिधि द्वारा लौटाए गए पंक्ति मूल्य के मूल्य के बराबर है। यदि स्थिति मेल नहीं खाती है, तो रूपांतरण संभव नहीं है और यदि मान मेल खाते हैं तो रूपांतरण किया जा सकता है।

हम इस तर्क को इस प्रकार लागू कर सकते हैं,

- (IBAction) कन्वर्ट: (UIButton *) प्रेषक {अगर ([_ ValueTextField.text लंबाई]<= 0) { [self showAlertWithMessage:@' Please enter the value'] } else { _ResultLabel.textColor= [UIColor blackColor] float res=0.0 NSInteger n =[_picker2 selectedRowInComponent:data2comp] if(n==secondrow) { float val=[_ValueTextField.text floatValue] NSLog(@'value %f',val) switch(selectedRow) { case 0:// Celsius to Fahrenheit res=(val*1.8)+32break case 1: // Fahrenheit to Celsius res=(val-32)/1.8break case 2: // meter to centimeter res= val*100 break case 3://centimeter to meter res=val*0.01 break default: res=0.0 } NSString *final= [NSString stringWithFormat:@'%.02f',res] _ResultLabel.text = final } else { // code for displaying error. _ResultLabel.textColor= [UIColor redColor] _ResultLabel.text = @'Result cannot be calculated' } }

अब एप्लिकेशन को चलाएं और पहले घटक में चयन करने के बाद दूसरे घटक में मूल्य बदलकर देखें।

java में jit क्या है

आप त्रुटि संदेश देख सकते हैं, कि परिणाम की गणना नहीं की जा सकती है। आप देखेंगे कि त्रुटि संदेश उसी परिणाम लेबल में मुद्रित किया गया था, और यह संदेश लंबा है। तो यही कारण है कि लेबल को पहले के अभिविन्यास से नीचे ले जाया गया था।

इसलिए, हमारा रूपांतरण ऐप पूरा हो गया है। आप अपनी पसंद के अनुसार ऐप में अधिक कार्यक्षमता जोड़ सकते हैं और इसे अपनी रचनात्मकता के अनुसार अधिक सुंदर बना सकते हैं।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? उन्हें टिप्पणी अनुभाग में उल्लेख करें और हम आपके पास वापस आ जाएंगे।

संबंधित पोस्ट: