iOS App: Paggawa Sa MultiComponent Picker



Ang blog na ito ay tungkol sa paglikha ng isang iOS app na nagpapakita ng conversion mula sa isang unit patungo sa isa pa. Inilalarawan nito ang pagtatrabaho ng isang Mutlicomponent Picker, Mga Alerto atbp.

Upang makakuha ng isang masusing pananaw, mangyaring basahin . Ito ang pangalawang blog ng serye ng ios app.





Kung ikaw ay isang nakaranasang developer na mausisa tungkol sa pagtatrabaho ng MultiComponent picker pagkatapos ay dumating ka sa tamang blog. Sa blog na ito, pag-uusapan ko kung paano pahabain ang aming app ng conversion na may higit na pag-andar sa pamamagitan ng pagpapatupad ng isang multicomponent picker, at kung paano din magsagawa ng pambihirang paghawak gamit ang mga alerto.

Nasahuling blog,nakita natin yan kapag nag-type kami ng isang bagay sa patlang ng teksto, pop up ang keyboard. Ang halagang mai-convert ay nai-type sa patlang ng teksto at pagkatapos ay nakikita natin na ang keyboard ay hindi nawawala.



Upang malutas ang problemang ito kailangan naming magdagdag ng isang pindutan na sumasaklaw sa buong view. Kapag nahipo ang gumagamit kahit saan sa background, dapat mawala ang keyboard.

Ngayon, magpatuloy tayo at gawin ito. Mag-drag ng isang pindutan, itakda ang uri ng pindutan bilang pasadya at kulay ng teksto bilang malinaw na kulay mula sa inspektor ng mga katangian.

tsart ng donut vs tsart ng pie

Mga Inspektor ng Katangian



at piliin ang Editor> Ayusin> Ipadala sa Balik

at baguhin ang laki ng pindutan sa isang paraan na umaangkop ito sa buong view.

Ang button na ito ay gumaganap ngayon bilang isang background invisible button na na-click upang mawala ang keyboard. Isulat natin ang IBAction para sa pareho, piliin ang mode ng katulong na editor at kontrolin ang + drag sa ViewController.h. Itakda ang Koneksyon sa Pagkilos at pangalan sa Background Button at i-click ang kumonekta.

Ang view controller code ay ganito ngayon.

#import @interface ViewController: UIViewController @property (malakas, nonatomic) IBOutlet UITextField * ValueTextField @property (malakas, nonatomic) IBOutlet UIPickerView * picker2 @property (malakas, nonatomic) NSArray * data @property (malakas, nonatletic) - (IBAction) I-convert: (UIButton *) nagpadala - (IBAction) background Button: (id) nagpadala @end

Lumipat sa ViewController.m at pagkatapos ay isulat ang sumusunod na code.

- (IBAction) background Button: (id) nagpadala {[_ValueTextField resignFirstResponder] [_picker2 resignFirstResponder] [_ResultLabel resignFirstResponder]}

Dito sinasabi ng code ang lahat ng iba pang mga bagay upang mabigyan ang unang katayuan ng tagatugon kapag nakita ang isang ugnayan. Ngayon, patakbuhin ang app at tingnan. Malalaman mong mawawala ang keyboard kapag hinawakan mo ang background. Ngayon upang pumunta ang keyboard kapag tapos ka nang mag-type, tawagan ang background Button na pamamaraan sa didselectRow () na pamamaraan ng picker. Kaya ang pamamaraan ng pamamaraan ay ang mga sumusunod.

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) row inComponent: (NSInteger) bahagi ng {napiliValue = _data [row] [self background Button: 0]}

Ngayon, maaari kang magtrabaho sa bahagi ng pagpapaganda ng app, tulad ng pagdaragdag ng isang background at marahil ay nagbibigay pa ng isang magarbong imahe ng pindutan. Gayunpaman, sa minahan, magtatakda ako ng isang imahe sa background.
Upang magawa iyon, maghanap muna ng naaangkop na imahe duh! Pagkatapos idagdag ito sa folder ng Mga Larawan.xcasset at baguhin ang imahe mula sa 1x hanggang 2x screen sa pangkalahatan.

Patakbuhin ang app at tingnan kung gumagana ito ng maayos.

Kung babaguhin ko ang aparato sa iphone 5s.

At patakbuhin ang app.

Makikita natin dito na ang lahat ay gumagana nang maayos tulad ng inaasahan. Ngayon paano kung nais kong magdagdag ng isang background sa aking pindutan at gawing mas katulad ng isang pindutan ang hitsura? Upang magawa iyon, idadagdag ko muna ang isang IBOutlet para sa pindutan ng pag-convert sa ViewController.h

@property (malakas, nonatomic) IBOutlet UIButton * mag-convert

at pagkatapos ay idagdag ang sumusunod na code sa viewDidLoad () na pamamaraan

self.convert.backgroundColor = [UIColor colorWithRed: 0.4 green: 0.8 blue: 1.0 alpha: 1.0] [_convert setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]

Patakbuhin natin ang aming app at tingnan, kung ito ang paraan na gusto namin ito.

Ok mahusay! Dapat napansin mo na binago ko rin ang mga posisyon ng label ng resulta, ang dahilan para sa pagbabago ay isang bagay na ipapaliwanag ko sa paglaon.

Alam namin na ang aming app ay nagko-convert mula sa Celsius patungong Fahrenheit at vise-versa lamang. Kaya, paano ang pagdaragdag ng ilang higit pang mga pagpapaandar o yunit upang mag-convert? Upang magawa ito, kailangan naming magdagdag ng isa pang sangkap sa UIPickerView na nagbibigay ng naaangkop na pagpipilian, kapag ang isang yunit ay napili sa unang bahagi ng tagapili.

Upang makagawa ng picker na nahahati sa dalawang bahagi, kailangan naming magdagdag ng isang bagong data ng NSArray, na hahawak sa data para sa pangalawang bahagi. Gayundin, tukuyin ang dalawang mga pare-pareho na kumakatawan sa aming dalawang mga bahagi. Dito, ang kaliwang bahagi ay idineklara 0 at ang tamang sangkap ay idineklara na 1 para sa pagiging simple ng pagprograma.

Ang iyong ViewController.h file ay mukhang

#import # kahulugan data1comp 0 # tukuyin ang data2comp 1 @interface ViewController: UIViewController @property (malakas, nonatomic) IBOutlet UITextField * ValueTextField @property (malakas, nonatomic) IBOutlet UIPickerView * picker2 @property (strong, nonatomic) NSArray malakas, nonatomic) NSArray * data2 @property (malakas, nonatomic) IBOutlet UILabel * ResultLabel @property (malakas, nonatomic) IBOutlet UIButton * convert - (IBAction) I-convert: (UIButton *) nagpadala - (IBAction) background Button: (id) nagpadala @end

Tukuyin ngayon ang array data2 sa paraan ng ViewDidLoad (). Ngayon na mayroon kaming parehong mga mapagkukunan ng data, dapat kaming magsulat ng code para sa tagapili sa isang paraan na kapag pumili kami ng isang item mula sa unang bahagi ng tagapili, ang pangalawang bahagi ay dapat na awtomatikong mabago sa kaukulang halaga. Ang pangalawang sangkap ay nakasalalay sa pagpili ng una.
Para sa mga ito, kailangan naming tukuyin ang isang diksyunaryo na mag-iimbak ng mga susi at halaga. Naglalaman ang mga key ng data na naaayon sa unang bahagi ng tagapili, at naglalaman ang mga halaga ng data na naaayon sa pangalawang bahagi ng tagapili.

- (void) viewDidLoad {[super viewDidLoad] // Gumawa ng anumang karagdagang pag-set up pagkatapos mai-load ang view, karaniwang mula sa isang nib. _data1 = [NSArray arrayWithObjects: @ 'Celsius', @ 'Fahrenheit', @ 'Meter', @ 'Centimeter', nil] data2 = [NSArray arrayWithObjects: @ 'Centimeter', @ 'Meter', @ 'Fahrenheit', @ 'Celsius', nil] dictionary = [NSDtionary dictionaryWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'Meter', @ 'Centimeter', @ 'Centimeter', @ 'Meter ', nil] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ')]]}

Ngayon, dapat nating baguhin ang mapagkukunan ng data at mag-delegate ng mga pamamaraan ng kasalukuyang picker sa mga sumusunod, upang mayroon kaming data na napunan sa parehong mga bahagi.

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {return 2} - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) sangkap {kung (sangkap == data1compata) {return [self] [count sa sarili.data2]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) row forComponent: (NSInteger) component {if (component == data1comp) {return [self.data1 objectAtIndex: row]} ibalik ang [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) row inComponent: (NSInteger) component {[self background Button: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex: row] NSArray * a = [dictionary objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent napili: data2compro napiliValue = = row}}

Dito sa aming didSelectRow () na pamamaraan, nakukuha namin ang napiling halaga ng unang sangkap, pagkatapos ay ipinapasa namin ito bilang argument sa objectForKey () na pamamaraan ng diksyunaryo, at makuha ang katumbas na halaga para sa susi. Upang hanapin ang katumbas na posisyon para sa halaga sa pangalawang array ie data2, ginagamit namin ang indexOfObject () na paraan ng pag-array at iimbak ang resulta sa isang integer na halaga.
Pagkatapos ay ipinapasa namin ang halagang integer na ito sa picker na pamamaraan na selectRow: row inComponent: component (). At i-reload ang bahagi ng picker gamit ang reloadComponent ().
Kapag nagawa na namin ito, habang pipiliin namin ang isang item mula sa unang sangkap, ang kaukulang item ay mapipili sa pangalawang bahagi ng picker.

Ang code para sa didSelectRow ()

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) row inComponent: (NSInteger) component {[self background Button: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex: row] NSArray * a = [dictionary objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] napiliValue = data11 napiliRow = row}}

Patakbuhin ngayon ang app at tingnan, kung gagana ang tagapili tulad ng inaasahan.

Voila! Gumagana siya!

Kaya't ipagpatuloy naming i-code ang aming pindutan ng pag-convert. Ang naunang tagapili ay may dalawang halaga lamang upang tumugma sa Celsius at Fahrenheit at pagkatapos ay kinakalkula ang resulta. Ngunit ngayon mayroon kaming apat na halagang Celsius, Fahrenheit, Meter at Centimeter. Kaya gumamit ako ng isang switch statement, na kinakalkula ang halaga batay sa napiling variable ng hilera.

- (IBAction) I-convert: (UIButton *) nagpadala {float val = [_ ValueTextField.text floatValue] switch ng NSLog (@ 'value% f', val) (selectRow) {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}

kung patakbuhin mo ang app, maaari naming makita na ang lahat ay gumagana nang maayos.

Ngayon, maaari naming suriin ang mga pagbubukod na maaaring maganap sa aming app. Halimbawa, walang halaga sa text box. O sinusubukan naming i-convert mula sa Celsius patungong Meter o Centimeter, na talagang hindi posible. Ang mga ganitong uri ng sitwasyon ay tinawag bilang mga pagbubukod at dapat nating iwasan ito sa pamamagitan ng pagsulat ng code upang mahawakan ang mga nasabing pagkakamali.

Malutas natin ang unang uri ng error na maaaring maganap kapag pinatakbo namin ang aming application. Iyon ay, napalampas namin na isulat ang aming halaga upang mai-convert sa textfield. Para sa senaryong ito, dapat naming alerto ang aming mga gumagamit upang ipasok ang halaga at pagkatapos ay magpatuloy.

Maaari naming gamitin ang UIAlertView para dito. Maaari kaming magsulat ng isang pamamaraan na pinangalanang showAlertWithMessage (NSString *) na mensahe. Sa pamamaraang ito, maaari naming ideklara ang isang alertView at pagkatapos ay maipakita ito gamit ang show () na paraan. Ang code para sa pamamaraan ay ang mga sumusunod.

- (walang bisa) showAlertWithMessage: (NSString *) mensahe {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ 'Error' message: message delegate: self cancel ButtonTitle: nil other ButtonTitles: @ 'Okay', nil] alertView.tag = 100 _ResultLabel.text=@'No Result '[alertView show]}

Ngayon ang pamamaraang ito kapag nag-click ang gumagamit ang pindutan ng pag-convert ay dapat tawaging bilang conversion. Ang pag-convert ay hindi dapat gawin nang hindi ipinasok ang halaga. Kaya sa kahulugan ng pamamaraan para sa pag-convert, dapat nating suriin kung ang haba ng textfield ay mas malaki kaysa o katumbas ng zero o hindi. Kung pagkatapos ay gawin ang conversion, iba pa ipakita ang alerto. Samakatuwid, ang convert button code ay magiging katulad ng:

- (IBAction) I-convert: (UIButton *) nagpadala {kung ([_ ValueTextField.text haba]<= 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 } }

Patakbuhin ngayon ang app at subukang mag-click sa pindutan ng pag-convert nang hindi naglalagay ng mga halaga sa textfield.

Ang pangalawang uri ng pagbubukod na maaaring maganap ay kung ang halaga sa unang bahagi ay hindi tumutugma sa halaga sa pangalawang bahagi ng UIPickerView. Para sa mga ito, sinusuri namin kung ang kasalukuyang napiling halaga ng hilera ng bahagi ng pangalawang bahagi ay katumbas ng halaga ng halagang halagang binabalik ng delegado ng didSelectRow () ng pamamaraan. Kung ang kalagayan ay hindi tumutugma, kung gayon ang pag-convert ay hindi posible at kung ang mga halaga ay tumutugma sa gayon ang pag-convert ay maaaring gawin.

Maaari naming ipatupad ang lohika na ito tulad ng sumusunod,

- (IBAction) I-convert: (UIButton *) nagpadala {kung ([_ ValueTextField.text haba]<= 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' } }

Patakbuhin ngayon ang app at tingnan sa pamamagitan ng pagbabago ng halaga sa pangalawang bahagi pagkatapos mong mapili ang unang sangkap.

Maaari mong makita ang mensahe ng error, na ang resulta ay hindi makakalkula. Mapapansin mo na ang mensahe ng error ay nakalimbag sa parehong label ng resulta, at mahaba ang mensahe. Kaya't ito ang dahilan kung bakit inilipat ang label mula sa naunang oryentasyon.

Kaya, kumpleto ang aming app ng conversion. Maaari kang magdagdag ng higit na pag-andar sa app alinsunod sa iyong pinili at gawing mas maganda ito ayon sa iyong pagkamalikhain.

May tanong ba sa amin? Nabanggit ang mga ito sa seksyon ng mga komento at babalikan ka namin.

pagkakaiba sa pagitan ng pamamaraang overloading at overriding sa java

Mga Kaugnay na Post: