„iOS“ programa: darbas su daugiakomponentiniu rinkikliu

Šis tinklaraštis skirtas sukurti „iOS“ programą, rodančią konversiją iš vieno vieneto į kitą. Jame aprašomas „Mutlicomponent Picker“ darbas, įspėjimai ir kt.

Norėdami gauti išsamią įžvalgą, perskaitykite . Tai antrasis „ios“ programų serijos tinklaraštis.



Jei esate patyręs kūrėjas, kuriam įdomu „MultiComponent“ rinkiklio darbas, jūs patekote į tinklaraštį. Šiame tinklaraštyje kalbėsiu apie tai, kaip išplėsti mūsų konversijos programą daugiau funkcijų įgyvendinant daugiakomponentį rinkiklį, ir apie tai, kaip atlikti išskirtinį valdymą naudojant įspėjimus.

Vidujepaskutinis tinklaraštis,mes tai matėme kai ką nors įvedame teksto lauke, pasirodo klaviatūra. Konvertuojama vertė įvedama teksto lauke, tada matome, kad klaviatūra neišnyksta.



Norėdami išspręsti šią problemą, turime pridėti mygtuką, kuris apima visą vaizdą. Kai vartotojas paliečia bet kurią fono vietą, klaviatūra turėtų išnykti.

Dabar eikime ir darykime tai. Vilkite mygtuką, nustatykite mygtuko tipą kaip pasirinktinį, o teksto spalva - aiškią iš atributų inspektoriaus.

Atributų inspektorius



ir pasirinkite Redaktorius> Tvarkyti> Siųsti atgal

ir pakeisti mygtuko dydį taip, kad jis atitiktų visą vaizdą.

Šis mygtukas dabar veikia kaip fone nematomas mygtukas, kurį spustelėjus klaviatūra dingsta. Parašykime tam pačiam „IBAction“, pasirinkite asistento redaktoriaus režimą ir valdykite + vilkite į „ViewController.h“. Nustatykite „Connection“ į veiksmą ir pavadinimą į „BackgroundButton“ ir spustelėkite prisijungti.

goto funkcija c ++

Rodinio valdiklio kodas atrodo taip dabar.

#import @interface ViewController: UIViewController @property (strong, nonatomic) IBOutlet UITextField * ValueTextField @property (strong, nonatomic) IBOutlet UIPickerView * picker2 @property (strong, nonatomic) NSArray * data @property * nonOutLablet (strong, nonatom) - (IBAction) Konvertuoti: (UIButton *) siuntėjas - (IBAction) backgroundButton: (id) sender @end

Perjunkite į „ViewController.m“ ir tada parašykite šį kodą.

- (IBAction) backgroundButton: (id) siuntėjas {[_ValueTextField resignFirstResponder] [_picker2 resignFirstResponder] [_ResultLabel resignFirstResponder]}

Čia kodas nurodo visiems kitiems objektams suteikti pirmojo atsakiklio būseną, kai aptinkamas prisilietimas. Dabar paleiskite programą ir pamatykite. Palietę foną galėsite sužinoti, kad klaviatūra dingsta. Dabar, kai klaviatūra eis, kai baigsite rašyti, rinkiklio didselectRow () metodu iškvieskite „backgroundButton“ metodą. Taigi metodo kodas bus toks.

- (negaliojantis) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) eilutė inComponent: (NSInteger) komponentas {selectedValue = _data [eilutė] [self backgroundButton: 0]}

Dabar galite dirbti su programos pagražinimo dalimi, pvz., Pridėti foną ir galbūt net pateikti įmantrų mygtuko vaizdą. Tačiau aš nustatysiu fono paveikslėlį.
Norėdami tai padaryti, pirmiausia raskite tinkamą vaizdą! Tada pridėkite jį į aplanką Images.xcassets ir pakeiskite vaizdą iš 1x į 2x ekraną visuotinai.

Paleiskite programą ir patikrinkite, ar ji gerai veikia.

Jei pakeisiu įrenginį į „iPhone 5s“.

Ir paleiskite programą.

Čia galime pamatyti, kad viskas veikia gerai, kaip tikėtasi. Ką daryti, jei aš norėčiau pridėti foną prie savo mygtuko ir padaryti išvaizdą panašesnį į mygtuką? Norėdami tai padaryti, pirmiausia į „ViewController.h“ pridėčiau konvertuojimo mygtuko „IBOutlet“

@property (stiprus, neatominis) IBOutlet UIButton * konvertuoti

ir tada pridėkite šį kodą į viewDidLoad () metodą

self.convert.backgroundColor = [UIColor colorWithRed: 0.4 žalia: 0.8 mėlyna: 1.0 alfa: 1.0] [_convert setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]

Paleiskime savo programą ir pažiūrėkime, ar ji yra tokia, kokia ji mums patinka.

Gerai, puiku! Turbūt pastebėjote, kad pakeičiau ir rezultatų etiketės pozicijas, pakeitimo priežastį paaiškinsiu vėliau.

Mes žinome, kad mūsų programa konvertuojama iš Celsijaus į Farenheitą ir atvirkščiai. Taigi, kaip pridėti dar keletą funkcijų ar vienetų konvertuoti? Norėdami tai padaryti, turime pridėti dar vieną komponentą prie „UIPickerView“, kuris suteikia tinkamą pasirinkimą, kai vienetas pasirenkamas pirmajame rinkiklio komponente.

Norėdami sukurti rinkiklį, suskirstytą į du komponentus, turime pridėti naujus NSArray duomenis2, kurie talpins antrojo komponento duomenis. Taip pat apibrėžkite dvi konstantas, kurios atspindės mūsų du komponentus. Kairysis komponentas deklaruojamas 0, o dešinysis - 1, kad būtų paprasčiau programuoti.

Jūsų „ViewController.h“ failas atrodo

#import # define data1comp 0 # define data2comp 1 @interface ViewController: UIViewController @property (strong, nonatomic) IBOutlet UITextField * ValueTextField @property (strong, nonatomic) IBOutlet UIPickerView * picker2 @property (strong, nonatomic1) stiprus, neatominis) NSArray * data2 @property (strong, nonatomic) IBOutlet UILabel * ResultLabel @property (strong, nonatomic) IBOutlet UIButton * convert - (IBAction) Convert: (UIButton *) sender - (IBAction) backgroundButton: (id) sender @pabaiga

Dabar apibrėžkite masyvo „data2“ metodą „ViewDidLoad ()“. Dabar, kai turime abu duomenų šaltinius, turime sugebėti parašyti rinkėjo kodą taip, kad kai pasirenkame elementą iš pirmojo rinkėjo komponento, antrasis komponentas turėtų automatiškai pasikeisti į atitinkamą vertę. Antrasis komponentas priklauso nuo pirmojo pasirinkimo.
Tam turime apibrėžti žodyną, kuriame bus saugomi raktai ir reikšmės. Raktuose yra duomenys, atitinkantys pirmąjį rinkiklio komponentą, o reikšmės - duomenys, atitinkantys antrąjį rinkiklio komponentą.

- (void) viewDidLoad {[super viewDidLoad] // Įkėlę rodinį atlikite bet kokią papildomą sąranką, paprastai iš nibo. _data1 = [NSArray arrayWithObjects: @ 'Celsius', @ 'Fahrenheit', @ 'Meter', @ 'Centimeter', nulis] duomenys2 = [NSArray arrayWithObjects: @ 'Centimetras', @ 'Matuoklis, @' Fahrenheit ', @ 'Celsijaus', nulio] žodynas = [NSDictionary dictionaryWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'Meter', @ 'Centimeter', @ 'Centimeter', @ 'Meter ', nulis] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ')]]}}

Dabar turime pakeisti duomenų šaltinį ir perduoti dabartinio rinkiklio metodus į šiuos, kad duomenys būtų užpildyti abiem komponentais.

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {return 2} - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) komponentas {if (komponentas == data1compata) {grąžinti [sav. [self.data2 count]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) eilutė komponentui: (NSInteger) komponentas {if (komponentas == data1comp) {grąžinti [self.data1 objectAtIndex: eilutė]} grąžinti [self.data2 objectAtIndex: row]} - (negaliojantis) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) eilutė inComponent: (NSInteger) komponentas {[self backgroundButton: 0] if (komponentas == data1comp) {NSString * data11 = [_ data1 objectAtIndex: eilutė] NSArray * a = [dictionary objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 pasirinktas reloadComponent: data2comp] = eilutė}}

Čia, atlikdami metodą didSelectRow (), gauname pasirinktą pirmojo komponento vertę, tada perduodame ją kaip argumentą žodyno metodui objectForKey () ir gauname atitinkamą rakto vertę. Norėdami rasti atitinkamą vertės antrojo masyvo poziciją, ty „data2“, naudojame masyvo „indexOfObject (“) metodą ir išsaugome rezultatą sveikojo skaičiaus reikšme.
Tada mes perduodame šią sveiko skaičiaus reikšmę rinkiklio metodo selectRow: row inComponent: component () metodui. Ir iš naujo įkelkite rinkiklio komponentą naudodami reloadComponent ().
Kai tai padarysime, kai mes pasirinksime vieną elementą iš pirmojo komponento, atitinkamas elementas bus pasirinktas antrame rinkiklio komponente.

„DidSelectRow“ () kodas

- (negaliojantis) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) eilutė inComponent: (NSInteger) komponentas {[self backgroundButton: 0] if (komponentas == data1comp) {NSString * data11 = [_ data1 objectAtIndex * eilutė] NSArray a = [dictionary objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] selectedValue = data11 selectedRow = row}}

Dabar paleiskite programą ir pažiūrėkite, ar rinkėjas veikia taip, kaip tikimasi.

Voila! tai veikia!

Taigi toliau koduokime mygtuką „konvertuoti“. Ankstesnis rinkėjas turėjo tik dvi reikšmes, t. Y. Celsijaus ir Fahrenheito, tada buvo apskaičiuotas rezultatas. Bet dabar turime keturias reikšmes Celsijaus, Farenheito, Matuoklio ir Centimetro. Taigi aš naudojau jungiklio teiginį, kuris apskaičiuoja vertę pagal pasirinktą eilutės kintamąjį.

- (IBAction) Konvertuoti: (UIButton *) siuntėjas {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) jungiklis (selectedRow) {atvejis 0: // Celsijaus į Fahrenheit res = (val *) 1.8) + 32 pertraukos atvejis 1: // Fahrenheitas iki Celsijaus res = (val-32) / 1,8 lūžio atvejis 2: // Metras iki Centimetras res = val * 100 pertraukos atvejis 3: // Centimetras iki Metras res = val * 0,01 lūžis numatytasis: res = 0.0} NSString * final = [NSString stringWithFormat: @ '%. 02f', res] _ResultLabel.text = final}

jei paleisite programą, matysime, kad viskas veikia gerai.

Dabar galime patikrinti, ar nėra išimčių, kurios gali atsirasti mūsų programoje. Pavyzdžiui, teksto laukelyje nėra vertės. Arba mes bandome konvertuoti iš Celsijaus į Metrą ar Centimetrą, o tai iš tikrųjų neįmanoma. Tokio tipo situacijos vadinamos išimtimis ir mes turime jos išvengti, rašydami kodą, kad pašalintume tokias klaidas.

Išspręskime pirmosios rūšies klaidas, kurios gali kilti paleidus programą. Tai yra, mes praleidžiame savo lauke parašyti savo vertę, kuri bus konvertuota. Pagal šį scenarijų mes turime įspėti savo vartotojus įvesti vertę ir tada tęsti.

Tam galime naudoti „UIAlertView“. Mes galime parašyti metodą pavadinimu showAlertWithMessage (NSString *). Taikydami šį metodą, mes galime paskelbti „alertView“ ir galiausiai jį parodyti naudodami „show ()“ metodą. Metodo kodas bus toks.

- (negaliojantis) showAlertWithMessage: (NSString *) pranešimas {UIAlertView * alertView = [[UIAlertView paskirstymas] initWithTitle: @ 'Error' pranešimas: pranešimo delegatas: self cancelButtonTitle: nėra kitoButtonTitles: @ 'Gerai', nulio] alertView.tag = _ResultLabel.text=@'Nėra rezultatų '[alertView show]}

Dabar šis metodas, kai vartotojas spusteli mygtuką konvertuoti, turi būti vadinamas konversija. Konvertavimas neturėtų būti atliekamas neįvedus vertės. Taigi konvertavimo metodo apibrėžime turime patikrinti, ar teksto lauko ilgis yra didesnis arba lygus nuliui, ar ne. Jei atliksite konversiją, rodykite įspėjimą. Todėl konvertuoti mygtuko kodas būtų toks:

- (IBAction) Konvertuoti: (UIButton *) siuntėjas {if ([_ ValueTextField.text length]<= 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 } }

Dabar paleiskite programą ir pabandykite spustelėti mygtuką konvertuoti, teksto lauke neįvedę reikšmių.

Antrasis išimties tipas, kuris gali atsirasti, yra tai, kad pirmojo komponento vertė nesutampa su antrojo „UIPickerView“ komponento verte. Tam mes patikriname, ar dabartinė pasirinkta antrojo komponento komponento eilutės vertė yra lygi eilutės vertės vertei, kurią grąžino metodo „didSelectRow ()“ delegatas. Jei sąlyga nesutampa, tada konversija neįmanoma ir, jei reikšmės sutampa, tada konversija gali būti atlikta.

„java“ programos „fibonacci“ serijoms

Mes galime įgyvendinti šią logiką taip,

- (IBAction) Konvertuoti: (UIButton *) siuntėjas {if ([_ ValueTextField.text length]<= 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' } }

Dabar paleiskite programą ir pamatysite, pakeisdami antrojo komponento vertę, kai atliksite pasirinkimą pirmajame komponente.

Galite pamatyti klaidos pranešimą, kad rezultato negalima apskaičiuoti. Pastebėsite, kad klaidos pranešimas buvo atspausdintas toje pačioje rezultatų etiketėje ir kad pranešimas ilgas. Štai kodėl etiketė buvo perkelta žemyn iš ankstesnės orientacijos.

Taigi, mūsų konversijos programa baigta. Galite pridėti daugiau funkcijų programoje pagal savo pasirinkimą ir padaryti ją gražesnę pagal savo kūrybiškumą.

Turite mums klausimą? Paminėkite juos komentarų skiltyje ir mes susisieksime su jumis.

Susijusios žinutės: