Приложение для iOS: работа с средством выбора нескольких компонентов



Этот блог посвящен созданию приложения для iOS, которое отображает преобразование одного устройства в другое. Он описывает работу средства выбора нескольких компонентов, предупреждений и т. Д.

Чтобы получить более подробное представление, прочтите . Это второй блог из серии приложений для ios.





Если вы опытный разработчик, которому интересно, как работает средство выбора нескольких компонентов, то вы попали в нужный блог. В этом блоге я расскажу о том, как расширить наше приложение для преобразования с большей функциональностью, реализовав многокомпонентный сборщик, а также о том, как выполнять исключительную обработку с помощью предупреждений.

впоследний блог,мы видели это когда мы что-то вводим в текстовое поле, всплывает клавиатура. Значение, которое нужно преобразовать, вводится в текстовое поле, и мы видим, что клавиатура не уходит.



Чтобы решить эту проблему, нам нужно добавить кнопку, охватывающую весь вид. Когда пользователь касается любого места фона, клавиатура должна исчезнуть.

А теперь давайте сделаем это. Перетащите кнопку, установите тип кнопки как пользовательский, а цвет текста как чистый цвет в инспекторе атрибутов.

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



и выберите «Редактор»> «Упорядочить»> «На задний план».

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

как остановить Java-программу в коде

Эта кнопка теперь действует как фоновая невидимая кнопка, при нажатии на которую клавиатура исчезает. Давайте для этого напишем IBAction, выберите режим помощника редактора и перетащите Ctrl + перетаскивание на ViewController.h. Установите для Connection значение Action и имя BackgroundButton и нажмите кнопку подключения.

Теперь код контроллера представления выглядит так.

#import @interface ViewController: UIViewController @property (сильный, неатомный) IBOutlet UITextField * ValueTextField @property (сильный, неатомный) IBOutlet UIPickerView * picker2 @property (сильный, неатомный) NSArray * data @property * (сильный, неатомный) NSArray * data @property - (IBAction) Convert: (UIButton *) sender - (IBAction) backgroundButton: (id) sender @end

Переключитесь на ViewController.m и напишите следующий код.

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

Здесь код сообщает всем остальным объектам, что при обнаружении прикосновения необходимо предоставить статус первого респондента. Теперь запустите приложение и посмотрите. Вы увидите, что клавиатура уходит, когда вы касаетесь фона. Теперь, когда клавиатура будет работать, когда вы закончите вводить текст, вызовите метод backgroundButton в методе didselectRow () средства выбора. Итак, код метода будет следующим.

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

Теперь вы можете поработать над украшением приложения, например добавить фон и, возможно, даже придать причудливое изображение кнопки. Однако в моем случае я буду устанавливать фоновое изображение.
Для этого сначала найдите подходящее изображение! Затем добавьте его в папку Images.xcassets и измените изображение с экрана 1x на 2x в универсальном.

Запустите приложение и посмотрите, нормально ли оно работает.

Если сменить девайс на iphone 5s.

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

Здесь мы видим, что все работает нормально, как и ожидалось. Что, если бы я хотел добавить фон к моей кнопке и сделать ее внешний вид более похожим на кнопку? Для этого я бы сначала добавил IBOutlet для кнопки преобразования в ViewController.h

@property (сильный, неатомарный) IBOutlet UIButton * convert

а затем добавьте следующий код в метод 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 (сильное, неатомное) IBOutlet UITextField * ValueTextField @property (сильное, неатомное) IBOutlet UIPickerView * picker2 @property (сильное, неатомное) NSArray сильный, неатомарный) 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', @ 'Celsius', nil] dictionary = [NSDictionary 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) component {if (component == data1comp) {return [self.data1 count]} return [self.data2 count]} - (NSString *) pickerView: (UIPickerView *) pickerView titleForRow: (NSInteger) row forComponent: (NSInteger) component {if (component == data1comp) {return [self.data1 objectAtIndex: row]} return [self.data2 objectAtIndex: row]} - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) row inComponent: (NSInteger) component {[self backgroundButton: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex: row] NSArray * a = [словарь objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] selectedValue = строка}}

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

Код для didSelectRow ()

- (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) row inComponent: (NSInteger) component {[self backgroundButton: 0] if (component == data1comp) {NSString * data11 = [_ data1 objectAtIndex: row] NSArray * a = [словарь objectForKey: data11] secondrow = [self.data2 indexOfObject: a] [_picker2 selectRow: secondrow inComponent: data2comp animated: YES] [_picker2 reloadComponent: data2comp] selectedValue = data11 selectedRow = row}}

Теперь запустите приложение и посмотрите, работает ли сборщик так, как ожидалось.

диплом аспиранта vs степень магистра

Вуаля! оно работает!

Итак, давайте продолжим кодировать нашу кнопку преобразования. В более раннем сборщике было только два значения для сопоставления, а именно Цельсия и Фаренгейта, а затем был рассчитан результат. Но теперь у нас есть четыре значения Цельсия, Фаренгейта, Метра и Сантиметра. Поэтому я использовал оператор switch, который вычисляет значение на основе выбранной переменной строки.

- (IBAction) Convert: (UIButton *) sender {float val = [_ ValueTextField.text floatValue] NSLog (@ 'value% f', val) switch (selectedRow) {case 0: // Цельсия в градусы Фаренгейта res = (val * 1.8) + 32break case 1: // от Фаренгейта к Цельсию res = (val-32) /1.8break case 2: // От метра к сантиметру res = val * 100 break case 3: // сантиметр в метр res = val * 0.01 перерыв по умолчанию: res = 0.0} NSString * final = [NSString stringWithFormat: @ '%. 02f', res] _ResultLabel.text = final}

если запустить приложение, мы увидим, что все работает нормально.

Теперь мы можем проверить исключения, которые могут возникнуть в нашем приложении. Например, в текстовом поле нет значения. Или мы пытаемся преобразовать градусы Цельсия в метры или сантиметры, что на самом деле невозможно. Такие ситуации называются исключениями, и мы должны избегать этого, написав код для обработки таких ошибок.

Давайте решим первый тип ошибки, которая может возникнуть при запуске нашего приложения. То есть мы упускаем возможность записать наше значение для преобразования в текстовое поле. Для этого сценария мы должны предупредить наших пользователей, чтобы они вводили значение, а затем продолжали.

Для этого мы можем использовать UIAlertView. Мы можем написать метод с именем showAlertWithMessage (NSString *) message. В этом методе мы можем объявить alertView, а затем, наконец, отобразить его с помощью метода show (). Код метода будет следующим.

- (void) showAlertWithMessage: (NSString *) message {UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ 'Error' сообщение: делегат сообщения: self cancelButtonTitle: nil otherButtonTitles: @ 'Okay', nil] alertView.tag = 100 _ResultLabel.text=@'No Result '[alertView show]}

Теперь этот метод, когда пользователь нажимает кнопку преобразования, должен вызываться преобразованием. Преобразование не должно выполняться без ввода значения. Таким образом, в определении метода для convert мы должны проверить, больше ли длина текстового поля или равна нулю или нет. Если это так, то выполните преобразование, иначе отобразите предупреждение. Следовательно, код кнопки преобразования будет таким:

- (IBAction) Convert: (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 } }

Теперь запустите приложение и попробуйте нажать кнопку преобразования, не вводя значения в текстовое поле.

Второй тип исключения, который может произойти, - это если значение в первом компоненте не совпадает со значением во втором компоненте UIPickerView. Для этого мы проверяем, равно ли текущее значение строки выбранного компонента второго компонента значению значения строки, возвращаемому делегатом метода didSelectRow (). Если условие не совпадает, преобразование невозможно, а если значения совпадают, преобразование может быть выполнено.

Мы можем реализовать эту логику следующим образом:

- (IBAction) Convert: (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' } }

Теперь запустите приложение и посмотрите, изменив значение во втором компоненте после того, как вы сделаете выбор в первом компоненте.

Вы можете увидеть сообщение об ошибке, что результат не может быть рассчитан. Вы заметите, что сообщение об ошибке было напечатано на той же этикетке результата, и что сообщение длинное. Вот почему этикетка была перемещена вниз с прежней ориентации.

Итак, наше приложение для конвертации готово. Вы можете расширить функциональность приложения по своему усмотрению и сделать его более красивым в соответствии с вашими творческими способностями.

Есть вопрос к нам? Упомяните их в разделе комментариев, и мы свяжемся с вами.

Похожие сообщения: