Приложение за iOS: Работа с многокомпонентен инструмент за избор



Този блог е за създаването на приложение за iOS, което показва преобразуване от една единица в друга. Той описва работата на Mutlicomponent Picker, Alerts и др.

За да получите задълбочена представа, моля прочетете . Това е вторият блог от поредицата приложения за ios.





Ако сте опитен разработчик, който се интересува от работата на MultiComponent picker, тогава сте попаднали в правилния блог. В този блог ще говоря за това как да разширим нашето приложение за преобразуване с повече функционалност чрез внедряване на многокомпонентен инструмент за избор, а също и как да извършим изключителна обработка с помощта на предупреждения.

Впоследен блог,виждали сме това когато напишем нещо в текстовото поле, клавиатурата изскача. Стойността, която трябва да се преобразува, се въвежда в текстовото поле и след това виждаме, че клавиатурата не изчезва.



За да разрешим този проблем, трябва да добавим бутон, който покрива целия изглед. Когато потребителят докосне произволно място на фона, клавиатурата трябва да изчезне.

Сега нека да го направим. Плъзнете бутон, задайте вида на бутона като потребителски и цвят на текста като ясен цвят от инспектора на атрибутите.

Инспектор на атрибутите



и изберете Редактор> Подреждане> Изпращане обратно

програма за свързан списък в c

и преоразмерете бутона по такъв начин, че да отговаря на целия изглед.

Този бутон сега действа като невидим бутон на фона, върху който се щраква, за да изчезне клавиатурата. Нека напишем IBAction за същото, изберете режим на помощник редактор и контролирайте + плъзнете към ViewController.h. Задайте Connection на Action и дайте име на BackgroundButton и щракнете върху connect.

Кодът на контролера на изгледа изглежда така сега.

#import @interface ViewController: UIViewController @property (strong, nonatomic) IBOutlet UITextField * ValueTextField @property (strong, nonatomic) IBOutlet UIPickerView * picker2 @property (strong, nonatomic) NSArray * data @propertyIL stronglet - (IBAction) Конвертиране: (UIButton *) подател - (IBAction) backgroundButton: (id) sender @end

Превключете към ViewController.m и след това напишете следния код.

- (IBAction) backgroundButton: (id) подател {[_ValueTextField resignFirstResponder] [_picker2 resignFirstResponder] [_ResultLabel resignFirstResponder]}

Тук кодът казва на всички други обекти да получат състоянието на първия отговарящ при откриване на докосване. Сега стартирайте приложението и вижте. Ще можете да откриете, че клавиатурата изчезва, когато докоснете фона. Сега, за да отиде клавиатурата, когато приключите с писането, извикайте метода backgroundButton в метода didselectRow () на инструмента за избор. Така че кодът на метода ще бъде както следва.

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) ред inComponent: (NSInteger) компонент {selectedValue = _data [row] [self backgroundButton: 0]}

Сега можете да работите върху разкрасителната част на приложението, като добавяне на фон и може би дори даване на изискано изображение на бутон. Обаче в моята ще задавам фоново изображение.
За да направите това, първо намерете подходящо изображение! След това го добавете към папката Images.xcassets и променете изображението от 1x на 2x екран в универсален.

Стартирайте приложението и вижте дали работи добре.

Ако сменя устройството на iphone 5s.

И стартирайте приложението.

Тук можем да видим, че всичко работи добре, както се очаква. Ами сега, ако исках да добавя фон към бутона си и да направя външния вид по-скоро като бутон? За целта първо бих добавил IBOutlet за бутона за конвертиране към ViewController.h

@property (силен, неатомичен) IBOutlet UIButton * конвертиране

и след това добавете следния код в метода viewDidLoad ()

self.convert.backgroundColor = [UIColor colorWithRed: 0,4 зелено: 0,8 синьо: 1,0 алфа: 1,0] [_convert setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]

Нека да стартираме нашето приложение и да видим дали е така, както ни харесва.

ОК страхотно! Сигурно сте забелязали, че съм променил и позициите на етикета с резултатите, причината за промяната е нещо, което ще обясня по-късно.

Знаем, че нашето приложение конвертира от Целзий във Фаренхайт и обратно. И така, какво ще кажете за добавяне на още няколко функции или единици за конвертиране? За целта трябва да добавим още един компонент към UIPickerView, който дава подходящ избор, когато единица е избрана в първия компонент на инструмента за избор.

За да направим инструмент за избор, разделен на два компонента, трябва да добавим нов NSArray data2, който ще съхранява данните за втория компонент. Също така дефинирайте две константи, които ще представляват нашите два компонента. Тук левият компонент е деклариран 0, а десният компонент е деклариран 1 за простота на програмиране.

Вашият файл ViewController.h изглежда така

#import # define data1comp 0 # define data2comp 1 @interface ViewController: UIViewController @property (strong, nonatomic) IBOutlet UITextField * ValueTextField @property (strong, nonatomic) IBOutlet UIPickerView * picker2 @property (strong, nonatomic * data1 @property) силен, неатомичен) NSArray * data2 @property (силен, неатомичен) IBOutlet UILabel * ResultLabel @property (силен, неатомичен) IBOutlet UIButton * convert - (IBAction) Convert: (UIButton *) sender - (IBAction) backgroundButton: (id) sender @край

Сега дефинирайте масива data2 в метода ViewDidLoad (). Сега, когато разполагаме с двата източника на данни, трябва да можем да напишем код за инструмента за избор по такъв начин, че когато избираме елемент от първия компонент на инструмента за избор, вторият компонент трябва автоматично да се промени до съответната стойност. Вторият компонент зависи от избора на първия.
За това трябва да дефинираме речник, който да съхранява ключовете и стойностите. Ключовете съдържат данните, съответстващи на първия компонент на инструмента за избор, а стойностите съдържат данните, съответстващи на втория компонент на инструмента за избор.

- (void) viewDidLoad {[super viewDidLoad] // Извършете допълнителна настройка след зареждане на изгледа, обикновено от перото. _data1 = [NSArray arrayWithObjects: @ 'Celsius', @ 'Fahrenheit', @ 'Meter', @ 'Centimeter', nil] data2 = [NSArray arrayWithObjects: @ 'Centimeter', @ 'Meter', @ 'Fahrenheit', @ 'Целзий', нула] речник = [NSD Dictionary dictionaryWithObjectsAndKeys: @ 'Celcius', @ 'Farenheit', @ 'Farenheit', @ 'Celcius', @ 'Meter', @ 'Centimeter', @ 'Centimeter', @ 'Meter ', nil] self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: (@' bg2.png ']]]}

Сега трябва да променим източника на данни и да делегираме методите на текущия инструмент за избор на следните, за да имаме данни, попълнени и в двата компонента.

- (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView {return 2} - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) компонент {if (компонент == data1compta [self.data2 count]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) ред forComponent: (NSInteger) компонент {if (component == data1comp) {return [self.data1 objectAtIndex: row]} върнете [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) ред inComponent: (NSInteger) компонент {[self backgroundButton: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex: row] NSArray * a = [object objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp11 selectedV data2comue11 selectedV = ред}}

Тук в нашия метод didSelectRow () получаваме избраната стойност на първия компонент, след което я предаваме като аргумент на метода objectForKey () на речника и получаваме съответната стойност за ключа. За да намерим съответната позиция за стойността във втория масив, т.е. data2, използваме метода indexOfObject () на масива и съхраняваме резултата в цяло число.
След това предаваме тази цялостна стойност на метода за избор на метод selectRow: row inComponent: component (). И презаредете компонента на инструмента за избор, като използвате reloadComponent ().
След като направим това, докато избираме един елемент от първия компонент, съответният елемент ще бъде избран във втория компонент на инструмента за избор.

Кодът за didSelectRow ()

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) ред inComponent: (NSInteger) компонент {[self backgroundButton: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex: row] NSAr a = [обект на речникаForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp анимиран: ДА] [_picker2 reloadComponent: data2comp] selectedValue = data11 selectedRow = row}}

Сега стартирайте приложението и вижте дали инструментът за избор работи така, както се очаква.

Voila! работи!

Така че нека продължим да кодираме нашия бутон за конвертиране. По-ранният инструмент за избор е имал само две стойности, които съответстват на Целзий и Фаренхайт и след това резултатът е изчислен. Но сега имаме четири стойности по Целзий, Фаренхайт, метър и сантиметър. Така че използвах оператор за превключване, който изчислява стойността въз основа на избраната променлива на реда.

- (IBAction) Конвертиране: (UIButton *) sender {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) switch (selectedRow) {case 0: // Celsius to Fahrenheit res = (val * 1.8) + 32брейк случай 1: // Фаренхайт до Целзий res = (val-32) /1.8break случай 2: // Метър до сантиметър res = val * 100 прекъсване случай 3: // Сантиметър до метър res = val * 0,01 пауза по подразбиране: res = 0.0} NSString * final = [NSString stringWithFormat: @ '%. 02f', res] _ResultLabel.text = final}

ако стартирате приложението, можем да видим, че всичко работи добре.

Сега можем да проверим за изключения, които могат да възникнат в нашето приложение. Например в текстовото поле няма стойност. Или се опитваме да конвертираме от Целзий в Метър или Сантиметър, което всъщност не е възможно. Този тип ситуации се наричат ​​изключения и трябва да го избягваме, като пишем код за обработка на такива грешки.

Нека решим първия вид грешка, която може да възникне, когато стартираме нашето приложение. Тоест, ние пропускаме да напишем нашата стойност, която да бъде преобразувана в текстовото поле. За този сценарий трябва да предупредим нашите потребители да въведат стойността и след това да продължат.

За това можем да използваме UIAlertView. Можем да напишем метод, наречен showAlertWithMessage (NSString *) съобщение. В този метод можем да декларираме alertView и след това да го покажем накрая, използвайки метода show (). Кодът за метода ще бъде както следва.

- (void) showAlertWithMessage: (NSString *) message {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ 'Error' message: message delegate: self cancelButtonTitle: nil otherButtonTitles: @ 'Okay', nilta alertV = 100, nilta] _ResultLabel.text=@'Без резултат '[alertView show]}

Сега този метод, когато потребителят щракне върху бутона за конвертиране, трябва да бъде извикан като преобразуване. Преобразуването не трябва да се извършва без въвеждане на стойността. Така че в дефиницията на метода за преобразуване трябва да проверим дали дължината на текстовото поле е по-голяма или равна на нула или не. Ако е така, направете преобразуването, иначе покажете предупреждението. Следователно кодът на бутона за конвертиране ще бъде като:

- (IBAction) Конвертиране: (UIButton *) подател {if ([_ 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. За това проверяваме дали текущата стойност на избрания компонент на втория компонент е равна на стойността на стойността на реда, върната от делегата didSelectRow () на метода. Ако условието не съвпада, преобразуването не е възможно и ако стойностите съвпадат, преобразуването може да се извърши.

Можем да приложим тази логика, както следва,

- (IBAction) Конвертиране: (UIButton *) подател {if ([_ 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' } }

Сега стартирайте приложението и вижте, като промените стойността във втория компонент, след като направите избора в първия компонент.

Можете да видите съобщението за грешка, че резултатът не може да бъде изчислен. Ще забележите, че съобщението за грешка е отпечатано в същия етикет с резултат и че съобщението е дълго. Ето защо етикетът е изместен надолу от по-ранната ориентация.

И така, нашето приложение за преобразуване е завършено. Можете да добавите повече функционалност към приложението според вашия избор и да го направите по-красиво според вашето творчество.

Имате въпрос към нас? Споменете ги в раздела за коментари и ние ще се свържем с вас.

mysql урок за начинаещи с примери

Подобни публикации: