иОС апликација: рад са вишекомпонентним бирачем



Овај блог говори о стварању иос апликације која приказује конверзију из једне јединице у другу. Описује рад берача Мутлицомпонент, упозорења итд.

Да бисте стекли темељни увид, прочитајте . Ово је други блог из серије иОС апликација.





Ако сте искусни програмер који је радознао о раду вишекомпонентног бирача, дошли сте на прави блог. На овом блогу ћу говорити о томе како да проширимо нашу апликацију за конверзију са више функционалности применом вишекомпонентног бирача, као и како да извршим изузетно руковање помоћу упозорења.

проследи вредност у јави

Упоследњи блог,то смо видели када укуцамо нешто у поље за текст, тастатура се појављује. Вредност коју треба претворити укуцава се у поље за текст и тада видимо да тастатура не нестаје.



Да бисмо решили овај проблем морамо додати дугме које покрива цео приказ. Када корисник додирне било које место у позадини, тастатура би требало да нестане.

Сада, хајде да то урадимо. Повуците дугме, подесите тип дугмета као прилагођени, а боју текста као прозирну боју из инспектора атрибута.

Инспектор својстава



и изаберите Едитор> Арранге> Сенд то Бацк

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

Ово дугме сада делује као невидљиво дугме у позадини на које се притиска да тастатура нестане. Напишимо ИБАцтион за исти, изаберите режим уређивача помоћника и притисните + повуците до ВиевЦонтроллер.х. Подесите Цоннецтион на Ацтион и именујте БацкгроундБуттон и кликните на цоннецт.

Код контролера погледа сада изгледа овако.

#импорт @интерфаце ВиевЦонтроллер: УИВиевЦонтроллер @проперти (стронг, нонатомиц) ИБОутлет УИТектФиелд * ВалуеТектФиелд @проперти (стронг, нонатомиц) ИБОутлет УИПицкерВиев * пицкер2 @проперти (стронг, нонатомиц) НСАрраи * дата @пропертиИЛ стронгбел, стронг - (ИБАцтион) Претвори: (УИБуттон *) пошиљалац - (ИБАцтион) бацкгроундБуттон: (ид) сендер @енд

Пређите на ВиевЦонтроллер.м, а затим напишите следећи код.

- (ИБАцтион) бацкгроундБуттон: (ид) пошиљалац {[_ВалуеТектФиелд ресигнФирстРеспондер] [_пицкер2 ресигнФирстРеспондер] [_РесултЛабел ресигнФирстРеспондер]}

Овде код говори свим осталим објектима да дају статус првог одзивника када се открије додир. Сада покрените апликацију и погледајте. Кад додирнете позадину, моћи ћете да откријете да тастатура нестаје. Сада да се тастатура покрене када завршите са куцањем, позовите метод бацкгроундБуттон у методи дидселецтРов () бирача. Тако ће код методе бити следећи.

- (воид) пицкерВиев: (УИПицкерВиев *) пицкерВиев дидСелецтРов: (НСИнтегер) ред инЦомпонент: (НСИнтегер) компонента {селецтедВалуе = _дата [ров] [селф бацкгроундБуттон: 0]}

Сада можете да радите на делу за улепшавање апликације, попут додавања позадине и можда чак и давања фантастичне слике дугмета. Међутим, у мојој ћу поставити позадинску слику.
Да бисте то урадили, прво пронађите одговарајућу слику! Затим га додајте у директоријум Имагес.кцассетс и промените слику са 1к на 2к екран у универзалном облику.

Покрените апликацију и погледајте да ли ради добро.

Ако променим уређај у ипхоне 5с.

И покрените апликацију.

Овде можемо видети да све функционише у реду како се очекивало. А шта ако бих желео да додам позадину свом дугмету и изглед учиним сличнијим дугмету? Да бих то урадио, прво бих додао ВиевОнтроллер.х ИБОутлет за дугме за претварање

@проперти (стронг, неатомиц) ИБОутлет УИБуттон * цонверт

а затим додајте следећи код у методу виевДидЛоад ()

селф.цонверт.бацкгроундЦолор = [УИЦолор цолорВитхРед: 0.4 зелена: 0.8 плава: 1.0 алфа: 1.0] [_цонверт сетТитлеЦолор: [УИЦолор вхитеЦолор] форСтате: УИЦонтролСтатеНормал]

Покренимо нашу апликацију и видимо да ли је то онако како нам се свиђа.

Ок супер! Сигурно сте приметили да сам и ја променио положај ознаке резултата, разлог промене је нешто што ћу објаснити касније.

Знамо да се наша апликација претвара из Целзијуса у Фахренхеит и обрнуто. Па, шта кажете на додавање још неколико функција или јединица за претварање? Да бисмо то урадили, у УИПицкерВиев морамо додати још једну компоненту која даје одговарајући избор када је јединица изабрана у првој компоненти бирача.

Да би бирач био подељен на две компоненте, треба да додамо нови НСАрраи дата2, који ће садржати податке за другу компоненту. Такође, дефинишите две константе које ће представљати наше две компоненте. Овде је лева компонента проглашена 0, а десна компонента 1 због једноставности програмирања.

Ваша датотека ВиевЦонтроллер.х изгледа

#импорт # дефине дата1цомп 0 # дефине дата2цомп 1 @интерфаце ВиевЦонтроллер: УИВиевЦонтроллер @проперти (стронг, нонатомиц) ИБОутлет УИТектФиелд * ВалуеТектФиелд @проперти (стронг, нонатомиц) ИБОутлет УИПицкерВиев * пицкер2 @проперти (стронг, норанраи) јак, неатомичан) НСАрраи * дата2 @проперти (стронг, нонатомиц) ИБОутлет УИЛабел * РесултЛабел @проперти (стронг, нонатомиц) ИБОутлет УИБуттон * цонверт - (ИБАцтион) Цонверт: (УИБуттон *) сендер - (ИБАцтион) бацкгроундБуттон: (ид) сендер @крај

Сада дефинишите низ података2 у методи ВиевДидЛоад (). Сад кад имамо оба извора података, морамо бити у стању да напишемо код за бирач на такав начин да, када одаберемо ставку из прве компоненте бирача, друга компонента треба аутоматски да се промени у одговарајућу вредност. Друга компонента зависи од избора прве.
За ово морамо да дефинишемо речник који ће чувати кључеве и вредности. Кључеви садрже податке који одговарају првој компоненти бирача, а вредности садрже податке који одговарају другој компоненти бирача.

- (воид) виевДидЛоад {[супер виевДидЛоад] // Обавите било каква додатна подешавања након учитавања погледа, обично из врха. _дата1 = [НСАрраи арраиВитхОбјецтс: @ 'Целзијус', @ 'Фахренхеит', @ 'Метер', @ 'Центиметер', нил] дата2 = [НСАрраи арраиВитхОбјецтс: @ 'Центиметар', @ 'Метер', @ 'Фахренхеит', @ 'Целзијус', нил] речник = [НСДицтионари дицтионариВитхОбјецтсАндКеис: @ 'Целциус', @ 'Фаренхеит', @ 'Фаренхеит', @ 'Целциус', @ 'Метер', @ 'Центиметер', @ 'Центиметер', @ 'Метер ', нил] селф.виев.бацкгроундЦолор = [УИЦолор цолорВитхПаттернИмаге: [УИИмаге имагеНамед: (@' бг2.пнг ')]]}

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

- (НСИнтегер) нумберОфЦомпонентсИнПицкерВиев: (УИПицкерВиев *) пицкерВиев {ретурн 2} - (НСИнтегер) пицкерВиев: (УИПицкерВиев *) пицкерВиев нумберОфРовсИнЦомпонент: (НСИнтегер) компонента {иф (компонента == дата1цомпта. [селф.дата2 цоунт]} - (НССтринг *) пицкерВиев: (УИПицкерВиев *) пицкерВиев титлеФорРов: (НСИнтегер) ред форЦомпонент: (НСИнтегер) компонента {иф (компонента == дата1цомп) {ретурн [селф.дата1 објецтАтИндек: ров]} врати [селф.дата2 објецтАтИндек: ров]} - (воид) пицкерВиев: (УИПицкерВиев *) пицкерВиев дидСелецтРов: (НСИнтегер) ред инЦомпонент: (НСИнтегер) компонента {[селф бацкгроундБуттон: 0] иф (компонента == дата1цомп) {НССтринг * дата11 = [_ дата1 објецтАтИндек: ров] НСАрраи * а = [дицтионари објецтФорКеи: дата11] сецондров = [селф.дата2 индекОфОбјецт: а] [_пицкер2 селецтРов: сецондров инЦомпонент: дата2цомп аниматед: ИЕС] [_пицкер2 релоадЦомпонент: дата2цомп11 селецтедВ = ред}}

Овде, у нашој методи дидСелецтРов (), добијамо изабрану вредност прве компоненте, затим је прослеђујемо као аргумент у методу објецтФорКеи () речника и добијамо одговарајућу вредност за кључ. Да бисмо пронашли одговарајући положај за вредност у другом низу, тј. Дата2, користимо методу индекОфОбјецт () низа и резултат чувамо у целобројној вредности.
Затим ову целобројну вредност прослеђујемо методи бирача селецтРов: ров инЦомпонент: компонента (). И поново учитајте компоненту бирача помоћу релоадЦомпонент ().
Када то учинимо, док одаберемо једну ставку из прве компоненте, одговарајућа ставка ће бити изабрана у другој компоненти бирача.

Код за дидСелецтРов ()

- (воид) пицкерВиев: (УИПицкерВиев *) пицкерВиев дидСелецтРов: (НСИнтегер) ред инЦомпонент: (НСИнтегер) компонента {[селф бацкгроундБуттон: 0] иф (компонента == дата1цомп) {НССтринг * дата11 = [_ дата1 објецтАтИндек: ров] НСАр а = [објецт објецтФорКеи: дата11] сецондров = [селф.дата2 индекОфОбјецт: а] [_пицкер2 селецтРов: сецондров инЦомпонент: дата2цомп анимирани: ДА] [_пицкер2 релоадЦомпонент: дата2цомп] селецтедВалуе = дата11 селецтедРов = ров}}

Сада покрените апликацију и погледајте да ли бирач ради онако како се очекује.

Воила! функционише!

Па наставимо да кодирамо наше дугме за претварање. Ранији бирач имао је само две вредности које се подударају, тј. Целзијус и Фахренхеит, а затим је израчунат резултат. Али сада имамо четири вредности Целзијуса, Фахренхеита, Метра и Центиметра. Дакле, користио сам наредбу свитцх, која израчунава вредност на основу изабране променљиве реда.

- (ИБАцтион) Претвори: (УИБуттон *) пошиљалац {флоат вал = [_ ВалуеТектФиелд.тект флоатВалуе] НСЛог (@ 'валуе% ф', вал) прекидач (селецтедРов) {цасе 0: // Целзијус у Фахренхеит рес = (вал * 1.8) + 32бреак случај 1: // Фахренхеит у Целзијус рес = (вал-32) /1.8бреак случај 2: // Метер у Центиметар рес = вал * 100 бреак цасе 3: // Центиметар у Метер рес = вал * 0,01 бреак подразумевано: рес = 0.0} НССтринг * финал = [НССтринг стрингВитхФормат: @ '%. 02ф', рес] _РесултЛабел.тект = финал}

ако покренете апликацију, видимо да све функционише у реду.

Сада можемо да проверимо изузетке који се могу појавити у нашој апликацији. На пример, у пољу за текст нема вредности. Или покушавамо да конвертујемо из Целзијуса у Метар или Центиметар, што заправо није могуће. Овакве ситуације се називају изузецима и морамо их избећи писањем кода за обраду таквих грешака.

Решимо прву врсту грешке која се може догодити када покренемо нашу апликацију. Односно, пропуштамо да напишемо своју вредност коју ћемо претворити у поље за текст. За овај сценарио морамо упозорити наше кориснике да унесу вредност и затим наставити.

За ово можемо да користимо УИАлертВиев. Можемо написати методу која се зове сховАлертВитхМессаге (НССтринг *). Овом методом можемо прогласити алертВиев, а затим га коначно приказати методом схов (). Шифра методе биће следећа.

- (воид) сховАлертВитхМессаге: (НССтринг *) порука {УИАлертВиев * алертВиев = [[УИАлертВиев аллоц] инитВитхТитле: @ 'Грешка' порука: делегат поруке: селф цанцелБуттонТитле: нил отхерБуттонТитлес: @ 'Окаи', нилтагВГ = нВ] _РесултЛабел.тект=@'Нема резултата '[алертВиев схов]}

Сада се овај метод када корисник кликне на дугме за конверзију мора позвати као конверзија. Конверзија се не сме вршити без уноса вредности. Дакле, у дефиницији методе за претварање, морамо проверити да ли је дужина текстуалног поља већа или једнака нули или не. Ако је то случај, извршите конверзију, у супротном прикажите упозорење. Према томе, код дугмета за претварање би био следећи:

- (ИБАцтион) Претвори: (УИБуттон *) пошиљалац {иф ([_ ВалуеТектФиелд.тект ленгтх]<= 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 } }

Сада покрените апликацију и покушајте да кликнете на дугме претвори без уношења вредности у поље за текст.

Други тип изузетка који би се могао догодити је ако се вредност у првој компоненти не подудара са вредношћу у другој компоненти УИПицкерВиев. За ово проверавамо да ли је тренутна вредност реда изабране компоненте друге компоненте једнака вредности вредности реда коју је вратио делегат методе дидСелецтРов (). Ако се услов не подудара, конверзија није могућа, а ако се вредности подударају, конверзија се може извршити.

Ову логику можемо применити на следећи начин,

пролазећи референцом у јави
- (ИБАцтион) Претвори: (УИБуттон *) пошиљалац {иф ([_ ВалуеТектФиелд.тект ленгтх]<= 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' } }

Сада покрените апликацију и погледајте тако што ћете променити вредност у другој компоненти након што извршите избор у првој компоненти.

Можете видети поруку о грешци да се резултат не може израчунати. Приметићете да је порука о грешци одштампана на истој налепници резултата и да је порука дугачка. Због тога је етикета померена надоле са раније оријентације.

Дакле, наша апликација за конверзију је завршена. Апликацији можете додати више функционалности према вашем избору и учинити је лепшом према својој креативности.

Имате питање за нас? Спомените их у одељку за коментаре и јавићемо вам се.

Повезани постови: