iOS lietotne: darbs ar daudzkomponentu atlasītāju



Šis emuārs ir par iOS lietotnes izveidi, kas parāda pārveidošanu no vienas vienības uz otru. Tajā aprakstīts Mutlicomponent Picker, Alerts utt darbs.

Lai iegūtu pamatīgu ieskatu, lūdzu, izlasiet . Šis ir ios lietotņu sērijas otrais emuārs.





Ja esat pieredzējis izstrādātājs, kurš interesējas par daudzkomponentu atlasītāja darbību, esat nonācis pareizajā emuārā. Šajā emuārā es runāšu par to, kā paplašināt mūsu reklāmguvumu lietotni ar lielāku funkcionalitāti, ieviešot daudzkomponentu atlasītāju, kā arī par to, kā veikt ārkārtas apstrādi, izmantojot brīdinājumus.

kas ir abstrakcija c ++

Iekšpēdējais emuārs,mēs to esam redzējuši kad kaut ko ierakstām teksta laukā, tiek parādīta tastatūra. Konvertējamā vērtība tiek ierakstīta teksta laukā, un tad mēs redzam, ka tastatūra nepazūd.



Lai atrisinātu šo problēmu, mums jāpievieno poga, kas aptver visu skatu. Kad lietotājs pieskaras jebkurai fona vietai, tastatūrai vajadzētu pazust.

Tagad turpināsim un darīsim to. Velciet pogu, iestatiet pogas veidu kā pielāgotu un teksta krāsu kā skaidru krāsu no atribūtu inspektora.

Atribūtu inspektors



un atlasiet Redaktors> Sakārtot> Sūtīt atpakaļ

un mainiet pogas izmēru tā, lai tā būtu piemērota visam skatam.

Šī poga tagad darbojas kā fonā neredzama poga, uz kuras noklikšķina, lai tastatūra pazustu. Uzrakstīsim IBAction par to pašu, atlasiet palīga redaktora režīmu un vadiet + velciet uz ViewController.h. Iestatiet Connection to Action un nosaukumu uz BackgroundButton un noklikšķiniet uz connect.

Skata kontrollera kods tagad izskatās šādi.

#import @interface ViewController: UIViewController @property (strong, nonatomic) IBOutlet UITextField * ValueTextField @property (strong, nonatomic) IBOutlet UIPickerView * picker2 @property (strong, nonatomic) NSArray * data @property (spēcīgs, neatomāts) - (IBAction) Convert: (UIButton *) sūtītājs - (IBAction) backgroundButton: (id) sender @end

Pārslēdzieties uz ViewController.m un pēc tam ierakstiet šo kodu.

- (IBAction) backgroundButton: (id) sūtītājs {[_ValueTextField resignFirstResponder] [_picker2 resignFirstResponder] [_ResultLabel resignFirstResponder]}

Šeit kods visiem pārējiem objektiem liek noteikt pirmā atbildētāja statusu, kad tiek konstatēts pieskāriens. Tagad palaidiet lietotni un redziet. Pieskaroties fonam, varēsiet uzzināt, ka tastatūra pazūd. Tagad, kad tastatūra darbojas, kad esat pabeidzis rakstīšanu, izsaucēja metodi backgroundButton atlasītāja didselectRow () metodē. Tātad metodes kods būs šāds.

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) rinda inComponent: (NSInteger) komponents {selectedValue = _data [rinda] [self backgroundButton: 0]}

Tagad jūs varat strādāt pie lietotnes skaistināšanas daļas, piemēram, pievienot fonu un, iespējams, pat dot iedomātu pogas attēlu. Tomēr manējā es iestatīšu fona attēlu.
Lai to izdarītu, vispirms atrodiet piemērotu attēlu! Pēc tam pievienojiet to mapei Images.xcassets un universālā režīmā mainiet attēlu no 1x uz 2x.

Palaidiet lietotni un pārbaudiet, vai tā darbojas labi.

Ja es nomainu ierīci uz iphone 5s.

Un palaidiet lietotni.

Šeit mēs varam redzēt, ka viss darbojas labi, kā paredzēts. Ko darīt, ja es vēlētos savai pogai pievienot fonu un padarīt izskatu līdzīgāku pogai? Lai to izdarītu, es vispirms pievienotu pogu Konvertēt IBOutlet ViewController.h

@property (strong, nonatomic) IBOutlet UIButton * pārveidot

un pēc tam pievienojiet šādu kodu metodē viewDidLoad ()

self.convert.backgroundColor = [UIColor colorWithRed: 0,4 zaļš: 0,8 zils: 1,0 alfa: 1,0] [_convert setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]

Palaidīsim mūsu lietotni un redzēsim, vai tā ir tāda, kāda mums patīk.

Labi lieliski! Jūs noteikti pamanījāt, ka esmu mainījis arī rezultātu etiķetes pozīcijas, izmaiņu iemesls ir tas, ko es paskaidrošu vēlāk.

Mēs zinām, ka mūsu lietotne no Celsija tiek pārveidota tikai par Farenheitu un tikai pretēji. Tātad, kā par vēl pāris funkciju vai vienību pievienošanu konvertēšanai? Lai to izdarītu, mums UIPickerView ir jāpievieno vēl viens komponents, kas nodrošina atbilstošu izvēli, kad atlasītāja vienībā tiek atlasīta vienība.

Lai izveidotu atlasītāju, kas sadalīts divās sastāvdaļās, mums jāpievieno jauni NSArray dati2, kas glabās otrā komponenta datus. Definējiet arī divas konstantes, kas pārstāvēs mūsu abus komponentus. Šeit kreiso komponentu deklarē par 0, bet labo - par 1, lai vienkāršotu programmēšanu.

Jūsu ViewController.h fails izskatās

#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) spēcīgs, nematomisks) NSArray * data2 @property (strong, nonatomic) IBOutlet UILabel * ResultLabel @property (strong, nonatomic) IBOutlet UIButton * convert - (IBAction) Convert: (UIButton *) sender - (IBAction) backgroundButton: (id) sender @ end

Tagad definējiet masīvu data2 ViewDidLoad () metodē. Tagad, kad mums ir abi datu avoti, mums jāspēj rakstīt atlasītāja kods tā, ka, atlasot vienumu no atlasītāja pirmā komponenta, otrais komponents automātiski tiek mainīts uz atbilstošo vērtību. Otrais komponents ir atkarīgs no pirmā izvēles.
Lai to izdarītu, mums jānosaka vārdnīca, kurā tiks glabāti taustiņi un vērtības. Taustiņi satur datus, kas atbilst atlasītāja pirmajam komponentam, un vērtības satur datus, kas atbilst atlasītāja otrajam komponentam.

- (void) viewDidLoad {[super viewDidLoad] // Pēc skata ielādes veiciet papildu iestatījumus, parasti no sprauslas. _data1 = [NSArray arrayWithObjects: @ 'Celsius', @ 'Fahrenheit', @ 'Meter', @ 'Centimeter', nulle] dati2 = [NSArray arrayWithObjects: @ 'Centimeter', @ 'Meter', @ 'Fahrenheit', @ 'Celsija', nulle] vārdnīca = [NSDictionary dictionaryWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'Meter', @ 'Centimeter', @ 'Centimeter', @ 'Meter ', nulle] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ')]]}}

Tagad mums ir jāmaina pašreizējā atlasītāja datu avots un jādeleģē šādas metodes, lai dati būtu aizpildīti abos komponentos.

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {atgriešanās 2} - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) komponents {if (komponents == data1compata) {atgriežas [pašsad.} [self.data2 skaits]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) rinda komponentam: (NSInteger) komponents {if (komponents == data1comp) {return [self.data1 objectAtIndex: rinda]} return [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) rinda inComponent: (NSInteger) komponents {[self backgroundButton: 0] if (komponents == data1comp) {NSString * data11 = [_ data1 objectAtIndex: rinda] NSArray * a = [dictionary objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponentRelectedData2comp] = rinda}}

Šeit, izmantojot metodi didSelectRow (), mēs iegūstam izvēlēto pirmā komponenta vērtību, pēc tam mēs to kā argumentu nododam vārdnīcas metodei objectForKey () un iegūstam atbilstošo atslēgas vērtību. Lai atrastu atbilstošo pozīciju vērtībai otrajā masīvā, t.i., data2, mēs izmantojam masīva indexOfObject () metodi un rezultātu glabājam vesela skaitļa vērtībā.
Pēc tam mēs nododam šo vesela skaitļa vērtību atlasītāja metodei selectRow: row inComponent: component (). Un atkārtoti ielādējiet atlasītāja komponentu, izmantojot reloadComponent ().
Kad tas būs izdarīts, izvēloties vienu vienumu no pirmā komponenta, atbilstošais vienums tiks atlasīts atlasītāja otrajā komponentā.

DidSelectRow () kods

informatica powercenter apmācība iesācējiem
- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) rinda inComponent: (NSInteger) komponents {[self backgroundButton: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex * rinda] NSArray a = [vārdnīcas objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] selectedValue = data11 selectedRow = row}}

Tagad palaidiet lietotni un pārbaudiet, vai atlasītājs darbojas tā, kā paredzēts.

Voila! tas strādā!

Tāpēc turpināsim kodēt pogu Konvertēt. Iepriekšējam atlasītājam bija tikai divas vērtības, kas sakritīs, t.i., pēc Celsija un Fārenheita, un pēc tam tika aprēķināts rezultāts. Bet tagad mums ir četras vērtības pēc Celsija, Fārenheita, Skaitītāja un Centimetra. Tāpēc esmu izmantojis slēdzi, kas aprēķina vērtību, pamatojoties uz izvēlēto rindas mainīgo.

- (IBAction) Convert: (UIButton *) sūtītājs {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) slēdzis (selectedRow) {gadījums 0: // Celsija līdz Fārenheita res = (val *) 1.8) + 32 pārtraukuma gadījums 1: // pēc Fārenheita līdz Celsija res = (val-32) / 1,8. Pārrāvuma gadījums 2: // Metrs līdz Centimetrs res = val * 100 pārtraukuma gadījums 3: // Centimetrs līdz Metrs res = val * 0,01 pārtraukums noklusējums: res = 0.0} NSString * final = [NSString stringWithFormat: @ '%. 02f', res] _ResultLabel.text = final}

ja palaižat lietotni, mēs varam redzēt, ka viss darbojas labi.

Tagad mēs varam pārbaudīt izņēmumus, kas var rasties mūsu lietotnē. Piemēram, tekstlodziņā nav vērtības. Vai arī mēs cenšamies pārvērst no Celsija uz Metru vai Centimetru, kas faktiski nav iespējams. Šāda veida situācijas tiek sauktas par izņēmumiem, un mums tas ir jāizvairās, rakstot kodu, lai rīkotos ar šādām kļūdām.

Atrisināsim pirmā veida kļūdas, kas var rasties, palaižot mūsu lietojumprogrammu. Tas ir, mēs nokavējam tekstu laukā ierakstīt savu vērtību, kas jāpārvērš. Šajā scenārijā mums jābrīdina mūsu lietotāji ievadīt vērtību un pēc tam turpināt.

Tam mēs varam izmantot UIAlertView. Mēs varam uzrakstīt metodi ar nosaukumu showAlertWithMessage (NSString *). Šajā metodē mēs varam pasludināt alertView un pēc tam to beidzot parādīt, izmantojot metodi show (). Metodes kods būs šāds.

- (void) showAlertWithMessage: (NSString *) ziņojums {UIAlertView * alertView = [[UIAlertView piešķīrums] initWithTitle: @ 'Error' ziņojums: ziņojuma delegāts: self cancelButtonTitle: nulle otherButtonTitles: @ 'Labi', nulle] alertView.tag = _ResultLabel.text=@'Nav rezultāta '[alertView show]}

Tagad šī metode, kad lietotājs noklikšķina uz pogas Konvertēt, ir jāsauc par reklāmguvumu. Konvertēšanu nevajadzētu veikt, neievadot vērtību. Tātad metodes pārveidošanai definīcijā mums jāpārbauda, ​​vai teksta lauka garums ir lielāks vai vienāds ar nulli, vai nē. Ja tā ir, veiciet konvertēšanu, citādi parādiet brīdinājumu. Tāpēc konvertēšanas pogas kods būtu šāds:

- (IBAction) Convert: (UIButton *) sūtītājs {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 } }

Tagad palaidiet lietotni un mēģiniet noklikšķināt uz pogas Konvertēt, tekstlodziņā neievadot vērtības.

Otrs izņēmuma veids, kas varētu rasties, ir, ja pirmā komponenta vērtība nesakrīt ar UIPickerView otrā komponenta vērtību. Šim nolūkam mēs pārbaudām, vai pašreizējā izvēlētā komponenta rindas otrā komponenta vērtība ir vienāda ar rindas vērtības vērtību, kuru atgrieza metodes didSelectRow () deleģētā persona. Ja nosacījums nesakrīt, tad konvertēšana nav iespējama un ja vērtības sakrīt, tad var veikt konvertēšanu.

Mēs varam īstenot šo loģiku šādi:

- (IBAction) Convert: (UIButton *) sūtītājs {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' } }

Tagad palaidiet lietotni un redziet, mainot vērtību otrajā komponentā pēc tam, kad esat izdarījis atlasi pirmajā komponentā.

Var redzēt kļūdas ziņojumu, ka rezultātu nevar aprēķināt. Jūs pamanīsit, ka kļūdas ziņojums tika izdrukāts tajā pašā rezultātu etiķetē un ka ziņojums ir garš. Tāpēc etiķete tika pārvietota uz leju no iepriekšējās orientācijas.

Tātad, mūsu reklāmguvumu lietotne ir pabeigta. Jūs varat pievienot lietotnei vairāk funkcionalitātes pēc savas izvēles un padarīt to skaistāku atbilstoši jūsu radošumam.

Vai mums ir jautājums? Pieminiet tos komentāru sadaļā, un mēs ar jums sazināsimies.

Saistītās ziņas: