iOS alkalmazás: Munka a többkomponensű választóval

Ez a blog egy olyan ios alkalmazás létrehozásáról szól, amely megjeleníti az egyik egységről a másikra történő átalakítást. Leírja a Mutlicomponent Picker, Alerts stb. Működését.



Kérjük, olvassa el az alapos betekintést . Ez az ios alkalmazássorozat második blogja.



Ha Ön tapasztalt fejlesztő, aki kíváncsi a MultiComponent picker működésére, akkor a megfelelő blogra jutott. Ebben a blogban arról fogok beszélni, hogy hogyan lehet kibővíteni a konverziós alkalmazásunkat több funkcióval egy többkomponensű választó alkalmazásával, valamint arról, hogyan lehet rendkívüli kezelést végrehajtani riasztások segítségével.

Ban,-benutolsó blog,ezt láttuk amikor beírunk valamit a szövegmezőbe, megjelenik a billentyűzet. Az átalakítandó érték beíródik a szövegmezőbe, és akkor látjuk, hogy a billentyűzet nem múlik el.



A probléma megoldásához hozzá kell adnunk egy gombot, amely lefedi a teljes nézetet. Amikor a felhasználó bárhová megérint a háttérben, a billentyűzetnek el kell tűnnie.

Most menjünk előre és tegyük meg. Húzza a gombot, állítsa be a gomb típusát egyéni és szöveg színűre az attribútum-ellenőrzőből.

Attribútumok ellenőr



és válassza a Szerkesztő> Rendezés> Küldés vissza menüpontot

goto nyilatkozat c ++

és méretezze át a gombot úgy, hogy az a teljes nézethez illeszkedjen.

Ez a gomb most egy láthatatlan háttérgombként működik, amelyre kattintva eltűnik a billentyűzet. Írjuk ugyanerre az IBAction-t, válasszuk ki az asszisztens szerkesztő módot, és a vezérlő + húzás a ViewControllerre.h. Állítsa a Connection műveletet és a nevet BackgroundButton értékre, majd kattintson a connect gombra.

A nézetvezérlő kódja most így néz ki.

#import @interface ViewController: UIViewController @property (erős, nem atomi) IBOutlet UITextField * ValueTextField @property (erős, nematomikus) IBOutlet UIPickerView * picker2 @property (erős, nem atomi) NSArray * data @property (erős, nem atom) - (IBAction) Konvertálás: (UIButton *) küldő - (IBAction) háttérButton: (id) sender @end

Váltson a ViewController.m fájlra, majd írja be a következő kódot.

- (IBAction) backgroundButton: (id) küldő {[_ValueTextField resignFirstResponder] [_picker2 resignFirstResponder] [_ResultLabel resignFirstResponder]}

Itt a kód megadja az összes többi objektumnak, hogy adjon meg első válaszadó státuszt, amikor érintést észlel. Most futtassa az alkalmazást, és nézze meg. A háttér megérintésekor megállapíthatja, hogy a billentyűzet eltűnik. Most, hogy a billentyűzet elinduljon, amikor végzett a gépeléssel, hívja meg a backgroundButton metódust a szedő didselectRow () metódusában. Tehát a módszer kódja a következő lesz.

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

Most dolgozhat az alkalmazás szépítő részén, például hozzáadhat egy hátteret, és talán még egy divatos gombképet is adhat. Az enyémben azonban beállítok egy háttérképet.
Ehhez először keressen megfelelő képet! Ezután adja hozzá a Images.xcassets mappához, és univerzálisan változtassa meg a képet 1x-ről 2x-re.

Futtassa az alkalmazást, és nézze meg, hogy jól működik-e.

Ha a készüléket iphone 5s-re cserélem.

És futtassa az alkalmazást.

Itt láthatjuk, hogy minden a várakozásoknak megfelelően működik. És mi lenne, ha szeretnék egy hátteret adni a gombomhoz, és a megjelenést inkább egy gombhoz hasonlítani? Ehhez először hozzá kell adnom egy IBOutletet a konvertáláshoz a ViewController.h fájlba

@property (erős, nem atomi) IBOutlet UIButton * konvertálás

majd adja hozzá a következő kódot a viewDidLoad () metódushoz

self.convert.backgroundColor = [UIColor colorWithRed: 0,4 zöld: 0,8 kék: 1,0 alfa: 1,0] [_convert setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]

Futtassuk az alkalmazást, és nézzük meg, hogy ez olyan, mint nekünk.

Jólvan szuper! Bizonyára észrevette, hogy megváltoztattam az eredménycímke pozícióit is, a változás oka az, amit később elmagyarázok.

Tudjuk, hogy alkalmazásunk Celsiustól Fahrenheit-re és csak satu-konvertál. Szóval, mit szólna hozzá néhány további funkció vagy egység átalakításához? Ehhez még egy összetevőt kell hozzáadnunk az UIPickerView-hoz, amely a megfelelő választást biztosítja, ha egy egységet választanak a válogató első összetevőjében.

Két komponensre osztott válogató elkészítéséhez hozzá kell adnunk egy új NSArray adatot2, amely tárolja a második komponens adatait. Adjon meg két állandót is, amelyek a két komponensünket képviselik. Itt a bal komponenst 0-val, a jobbat 1-vel deklaráljuk a programozás egyszerűsége érdekében.

A ViewController.h fájlja így néz ki

#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 NSA) erős, nonatomikus) NSArray * data2 @property (erős, nematomikus) IBOutlet UILabel * ResultLabel @property (erős, nematomikus) IBOutlet UIButton * konvertálás - (IBAction) Konvertálás: (UIButton *) küldő - (IBAction) háttérGomb: (id) küldő @end

Most adja meg a data2 tömböt a ViewDidLoad () metódusban. Most, hogy mindkét adatforrás megvan, képesnek kell lenniünk arra, hogy kódot írjon a válogatóhoz úgy, hogy amikor kiválasztunk egy elemet a válogató első összetevőjéből, akkor a második komponens automatikusan megváltozik a megfelelő értékre. A második komponens az első kiválasztásától függ.
Ehhez meg kell határoznunk egy szótárt, amely tárolja a kulcsokat és értékeket. A kulcsok a szedő első komponensének megfelelő adatokat tartalmazzák, az értékek pedig a szedő második komponensének megfelelő adatokat.

- (void) viewDidLoad {[super viewDidLoad] // Végezzen bármilyen további beállítást a nézet betöltése után, általában egy hüvelykből. _data1 = [NSArray arrayWithObjects: @ 'Celsius', @ 'Fahrenheit', @ 'Meter', @ 'Centimeter', nulla] adat2 = [NSArray arrayWithObjects: @ 'Centimeter', @ 'Meter', @ 'Fahrenheit', @ 'Celsius', nil] szótár = [NSDictionary dictionaryWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'Meter', @ 'Centimeter', @ 'Centimeter', @ 'Meter ', nulla] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ')]]}}

Most meg kell változtatnunk az aktuális választó adatforrását és a következõkre kell delegálnunk a módszereket, hogy mindkét összetevõbe kitöltsük az adatokat.

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {return 2} - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) komponens {if (component == data1compata) {return [self.defeld] {return [self.defit] {return [self.default] [self.data2 count]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) sor a Component: (NSInteger) komponenshez {if (component == data1comp) {return [self.data1 objectAtIndex: row]} return [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) sor inComponent: (NSInteger) komponens {[self backgroundButton: 0] if (komponens == 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 selected: data2comp] = sor}}

Itt a didSelectRow () metódusunkban megkapjuk az első komponens kiválasztott értékét, majd argumentumként átadjuk a szótár objectForKey () metódusának, és megkapjuk a kulcs megfelelő értékét. A második tömb, azaz az adat2 megfelelő értékének megtalálásához a tömb indexOfObject () metódusát használjuk, és az eredményt egész számban tároljuk.
Ezután ezt az egész értéket átadjuk a picker metódus selectRow: row inComponent: component () metódusának. Töltse be újra a szedő összetevőjét a reloadComponent () használatával.
Miután ezt megtettük, amikor kiválasztunk egy elemet az első komponensből, a megfelelő elem kiválasztásra kerül a válogató második összetevőjében.

A didSelectRow () kódja

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) sor inComponent: (NSInteger) komponens {[self backgroundButton: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex * sor] NSArray a = [szótár objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] selectedValue = data11 selectedRow = row}}

Most futtassa az alkalmazást, és nézze meg, hogy a választó a várt módon működik-e.

Voálá! működik!

Folytassuk tehát az átalakítás gomb kódolását. A korábbi válogatónak csak két értéke volt, azaz a Celsius és a Fahrenheit, majd kiszámolták az eredményt. De most négy Celsius, Fahrenheit, Meter és Centimeter értékünk van. Tehát egy switch utasítást használtam, amely az értéket a kiválasztott sorváltozó alapján számítja ki.

- (IBAction) Konvertálás: (UIButton *) küldő {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) kapcsoló (selectedRow) {eset 0: // Celsius-ból Fahrenheit-re res = (val * 1.8) + 32 töréses eset 1: // Fahrenheit – Celsius res = (val-32) / 1,8-os törés 2. eset: // Méter-centiméter res = val * 100-os szünet eset 3: // Centiméter-méter res = val * 0,01 törés alapértelmezett: res = 0.0} NSString * final = [NSString stringWithFormat: @ '%. 02f', res] _ResultLabel.text = final}

ha futtatja az alkalmazást, láthatjuk, hogy minden rendben működik.

Most ellenőrizhetjük az alkalmazásunkban előforduló kivételeket. Például a szövegmezőben nincs érték. Vagy megpróbálunk Celsius-ról méterre vagy centiméterre konvertálni, ami valójában nem lehetséges. Az ilyen típusú helyzeteket kivételként nevezzük, és ezt el kell kerülnünk, ha kódot írunk az ilyen hibák kezelésére.

Oldjuk meg az első típusú hibákat, amelyek az alkalmazás futtatásakor jelentkezhetnek. Vagyis elmulasztjuk megírni az átalakítandó értékünket a szövegmezőbe. Ehhez a szcenárióhoz figyelmeztetnünk kell a felhasználókat az érték megadására, majd a folytatásra.

Ehhez használhatjuk az UIAlertView alkalmazást. Kiírhatunk egy showAlertWithMessage (NSString *) nevű metódust. Ebben a módszerben deklarálhatunk egy alertView-t, majd végül a show () módszerrel megjeleníthetjük. A módszer kódja a következő lesz.

- (void) showAlertWithMessage: (NSString *) üzenet {UIAlertView * alertView = [[UIAlertView allokáció] initWithTitle: @ 'Hiba' üzenet: üzenet delegáltja: self cancelButtonTitle: nulla egyébButtonTitles: @ 'Oké', nulla] alertView.tag = _ResultLabel.text=@'Nincs eredmény '[alertView show]}

Most ezt a módszert, amikor a felhasználó a konvertálás gombra kattint, konverziónak kell hívni. Az átalakítást nem szabad elvégezni az érték megadása nélkül. Tehát a konverzió metódusdefiníciójában ellenőriznünk kell, hogy a szövegmező hossza nagyobb vagy egyenlő-e nullával vagy sem. Ha ez az, akkor végezze el az átalakítást, akkor másként jelenítse meg a riasztást. Ezért a konvertálás gomb kódja a következő lenne:

- (IBAction) Konvertálás: (UIButton *) sender {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 } }

Most futtassa az alkalmazást, és próbálja meg a konvertálás gombra kattintani anélkül, hogy értékeket írna be a szövegmezőbe.

A második típusú kivétel, amely akkor fordulhat elő, ha az első komponens értéke nem egyezik az UIPickerView második komponensének értékével. Ehhez ellenőrizzük, hogy a második komponens aktuálisan kiválasztott komponensorának értéke megegyezik-e a metódus didSelectRow () delegáltja által visszaadott sorérték értékével. Ha a feltétel nem egyezik, akkor az átalakítás nem lehetséges, és ha az értékek megegyeznek, akkor az átalakítás elvégezhető.

Ezt a logikát a következőképpen tudjuk megvalósítani,

- (IBAction) Konvertálás: (UIButton *) sender {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' } }

Most futtassa az alkalmazást, és nézze meg a második komponens értékének megváltoztatásával, miután kiválasztotta az első komponenst.

Láthatja a hibaüzenetet, miszerint az eredmény nem számolható. Észre fogja venni, hogy a hibaüzenetet ugyanabban az eredménycímkében nyomtatták ki, és hogy az üzenet hosszú. Tehát ezért mozgatta a címkét a korábbi tájolásból.

Tehát, az átalakító alkalmazásunk elkészült. Hozzáadhat több funkciót az alkalmazáshoz az Ön választása szerint, és szebbé teheti kreativitása szerint.

Van egy kérdésünk? Említse meg őket a megjegyzések részben, és mi kapcsolatba lépünk Önnel.

transzformációk az informatikában példával

Kapcsolódó hozzászólások: