Din første WatchKit Søknad: Bruker Interaction

Your Først WatchKit Søknad: Bruker Interaksjon

28
Del
to
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I forrige tutorial, vi utforsket det grunnleggende WatchKit utvikling. Vi skapte et prosjekt i Xcode, lagt en WatchKit søknad, og skapte en grunnleggende brukergrensesnitt.

Brukergrensesnittet i vår WatchKit søknad i øyeblikket viser statiske data. Med mindre du bor i ørkenen, det er ikke veldig nyttig for en vær søknad. I denne opplæringen, skal vi fylle brukergrensesnitt med data og lage noen handlinger.

1. Oppdatere Brukergrensesnitt

Trinn 1: Skifte WKInterfaceDate

Før vi fylle brukergrensesnitt med data, må vi gjøre en liten endring. I forrige tutorial, la vi en WKInterfaceDate eksempel til bunnen gruppe for å vise gjeldende klokkeslett og dato. Det ville være mer nyttig, men for å vise tid og dato for dataene vi viser. Bakgrunnen for denne endringen vil bli klart i en liten stund.

Åpne Interface.storyboard, fjern WKInterfaceDate eksempel i bunnen gruppen og erstatte den med en WKInterfaceLabel eksempel. Sett etikettens Bredde tilskrive Relativt til Container og etikettens Alignment til riktig justert

Trinn 2:. Legge Outlets

For å oppdatere brukergrensesnitt med dynamiske data, må vi lage noen utsalgssteder i InterfaceController klassen. Åpne dreieboken i hovedredaktør og InterfaceController.swift i Assistant Editor til høyre. Velg den øverste etiketten i den første gruppen og Kontroll-Dra fra etiketten InterfaceController klassen til å lage en stikkontakt. Navn uttaket locationLabel.

Gjenta disse trinnene for de andre etiketter, navngi dem henholdsvis temperatureLabel og dateLabel. Dette er hva InterfaceController klassen skal se ut når du er ferdig
importere WatchKitimport Foundationclass InterfaceController. WKInterfaceController {IBOutlet svak Var dateLabel: WKInterfaceLabel! IBOutlet Svak Var locationLabel: WKInterfaceLabel! IBOutlet Svak Var temperatureLabel: WKInterfaceLabel! styre func awakeWithContext (kontekst:? AnyObject) {super.awakeWithContext (kontekst)} overstyring func willActivate () {//Denne metoden kalles når klokken syn kontrolleren er i ferd med å bli synlig for brukeren super.willActivate ()} overstyring func didDeactivate ( ) {//Denne metoden kalles når klokken view controller er ikke lenger synlig super.didDeactivate ()}}

Nå kan være et godt tidspunkt å ta en nærmere titt på gjennomføringen av InterfaceController klassen. I forrige tutorial, nevnte jeg at InterfaceController arver fra WKInterfaceController. Ved første øyekast kan det virke som om en WKInterfaceController eksempel oppfører seg som en UIViewController eksempel, men vi har også lært i forrige tutorial at det finnes en rekke viktige forskjeller.

For å hjelpe oss, har Xcode befolket InterfaceController klasse med tre overstyrt metoder. Det er viktig å forstå når hver metode startes og hva den kan eller bør brukes for.

awakeWithContect (_ :)

I awakeWithContext (_ :) metode, sette deg opp og initial grensesnittet kontrolleren. Du lurer kanskje på hvordan det skiller seg fra init-metoden. Den awakeWithContext (_ :) metoden er påberopt etter grensesnittet kontrolleren er initialisert. Metoden tar en parameter, en kontekst objekt som tillater grensesnittstyringene å sende informasjon til en annen. Dette er den anbefalte tilnærmingen for bestått informasjon på tvers av scener, det vil si grensesnittstyringene.

willActivate

willActivate metoden er lik den viewWillAppear (_ :) metoden i UIViewController klassen. Den willActivate metoden startes før brukergrensesnittet av grensesnittet kontrolleren presenteres for brukeren. Den er ideell for å tilpasse brukergrensesnittet før det er presentert for brukeren.

didDeactivate

didDeactivate metoden er motstykket til willActivate metode og startes når scenen av grensesnittet kontrolleren har blitt fjernet . Enhver opprydding koden går inn i denne metoden. Denne metoden er lik den viewDidDisappear (_ :) metoden funnet i UIViewController klassen.

Med dette i tankene, kan vi begynne å laste data og oppdatering av brukergrensesnittet til vår WatchKit søknad. La oss starte med lasting værdata.

2. Laster værvarsel for
Best Practices

Du kan tenke at det neste trinnet innebærer et API-kall til en værtjeneste, men det er ikke tilfelle. Hvis vi var å bygge en iOS-applikasjonen, vil du være rett. Men vi skaper en WatchKit søknad.

Det er ikke anbefalt å gjøre komplekse API-kall for å hente data til å fylle brukergrensesnittet til en WatchKit søknad. Selv om Apple ikke eksplisitt nevner dette i dokumentasjonen, gjorde en Apple-ingeniør nevne dette uskreven beste praksis i Apples utviklerfora.

WatchKit programmet er en del av en iOS-applikasjonen, og det er iOS-applikasjon som er ansvarlig av å hente data fra en ekstern backend. Det finnes flere tilnærminger vi kan ta for å gjøre dette, bakgrunn henting være et godt valg. I denne opplæringen, men vi kommer ikke til å fokusere på det aspektet.

I stedet vil vi legge dummy data til bunten av WatchKit forlengelse og legger det i awakeWithContext (_ :) metoden vi diskutert tidligere

Opprett en tom fil ved å velge New >.; Fil ... fra Fil-menyen. Velg Empty fra iOS > Andre delen og navn på filen weather.json. Dobbeltsjekk at du legger filen til regndråpe WatchKit Extension. Ikke overse denne lille, men viktige detaljer. Befolke fil med følgende data
{"steder". [{"Location": "Cupertino", "temperatur": 24, "tidsstempel": 1427429751} {"location": "London", "temperatur ": 11," tidsstempel ": 1427429751}, {" location ":" Paris "," temperatur ": 9," tidsstempel ": 1427429751} {" location ":" Brussel "," temperatur ": 11," tidsstempel ": 1427429751}]}
deling av data

Deling av data mellom iOS søknad og WatchKit programmet er et viktig tema. Men fokuserer denne opplæringen på å få din første WatchKit program oppe og går. I en fremtidig opplæringen, vil jeg fokusere på deling av data mellom en iOS og WatchKit søknad.

Selv om vi ikke vil dekke deling av data i denne opplæringen, er det viktig å vite at iOS søknaden og WatchKit forlengelse deler ikke en sandkasse. Begge målene har sin egen sandkasse og det er det som gjør deling av data mindre triviell enn det virker.

For å dele data mellom iOS og WatchKit søknaden, må du utnytte app grupper. Men det er et tema for en fremtidig tutorial

Trinn 1:. Legge SwiftyJSON

Swift er et flott språk, men noen oppgaver er enklere i Objective-C enn de er i Swift. Håndtering JSON, for eksempel, er en slik oppgave. For å gjøre denne oppgaven enklere, har jeg valgt å utnytte den populære SwiftyJSON biblioteket.

Last ned depotet fra GitHub, pakk ut arkivet, og legg SwiftyJSON.swift til regndråpe WatchKit Extension gruppe. Denne filen ligger i kildemappen av arkivet. Dobbeltsjekk at SwiftyJSON.swift legges den regndråpe WatchKit Extension målet

Trinn 2:. Implementering værdata

For å gjøre det lettere å arbeide med været data som er lagret i weather.json Vi re kommer til å skape en struktur som heter værdata. Velg Nytt > Fil ... fra Fil-menyen, velg Swift fil fra iOS > § kilde, og navnet på filen værdata. Kontroller at filen er lagt til i regndråpe WatchKit Extension målet.

Gjennomføringen av værdata struktur er kort og enkel. . Strukturen definerer tre faste eiendommer, dato, sted og
temperatur import Foundationstruct værdata {la Dato: NSDate la plassering: String la temperatur: Double}

Fordi temperaturen verdien av weather.json er i Celcius, vi også gjennomføre en beregnet eiendom fahrenheit for enkel konvertering mellom Celsius og Fahrenheit
Var fahrentheit. Double {return temperatur * (9/5) + 32}

Vi har også definere to hjelpemetoder toCelciusString og toFahrenheitString å gjøre formateringstemperaturverdier lettere. Ikke du elsker Swifts streng interpole
func toCelciusString () - > String {return "\\ (temperatur) ° C"} func toFahrenheitString () - > String {return "\\ (fahrentheit) ° F"}

Som jeg sa, er gjennomføringen av værdata struktur kort og enkel. . Dette er hva gjennomføringen skal se ut
import Foundationstruct værdata {la Dato: NSDate la plassering: String la temperatur: Double Var fahrentheit: Double {return temperatur * (9/5) + 32} func toCelciusString () - > String {return "\\ (temperatur) ° C"} func toFahrenheitString () - > String {return "\\ (fahrentheit) ° F"}}
Trinn 3: Legge data

Før vi laste inn data fra weather.json, trenger vi å erklære en eiendom for lagring av værdata. Eiendommen, værdata, er av typen [værdata] og vil inneholde innholdet i weather.json som forekomster av værdata struktur
Var værdata. [Værdata] = []

For brukervennlighet, vi også erklære en beregnet eiendom, vær, som gir oss tilgang til det første elementet på værdata array. Det er data fra denne værdata eksempel at vi vil vise i grensesnittet kontrolleren. Kan du gjette hvorfor vi trenger å erklære vær eiendommen som tilleggs
Var været:? Værdata? {Return weatherData.first}

Vi laste dataene fra weather.json i awakeWithContext (_ :) metoden. For å holde gjennomføringen ren, påberope vi en hjelper metode kalt loadWeatherData
styre func awakeWithContext. (Kontekst:? AnyObject) {super.awakeWithContext (kontekst) //Legg værdata loadWeatherData ()}

Gjennomføringen av loadWeatherData er trolig den mest skremmende kodebiten vi får se i denne opplæringen. Som jeg sa, parsing JSON er ikke uvesentlig i Swift. Heldigvis gjør SwiftyJSON fleste av de tunge løftene for oss
func loadWeatherData () {la path = NSBundle.mainBundle () pathForResource ("vær", ofType: "JSON").. Hvis la path = bane {la data = NSData (contentsOfFile: bane) hvis la data = data {la værdata = JSON. (data: data) la steder = værdata ["Plasseringer"] rekke hvis la steder = steder {for plassering på steder {la timestamp = stedet ["tidsstempel "].dobbelt! la date = NSDate (timeIntervalSinceReferenceDate: timestamp) la modellen = værdata (dato: dato, sted: stedet ["location"] string !, temperatur. stedet ["temperaturen"] doble.!) self.weatherData.append (modell) }}}}}

Vi får banen til weather.json og laste innholdet som NSData objekt. Vi bruker SwiftyJSON å analysere JSON, passerer i NSData objektet. Vi får en referanse til matrisen for de sentrale steder og løkken over hvert sted.

Vi normaliserer værdata ved å konvertere tidsstempelet til en NSDate forekomst og klargjøre en værdata objekt. Til slutt legger vi værdata objektet til værdata array.

Jeg håper du enig i at gjennomføringen er ikke så vanskelig. Fordi Swift tvinger oss til å gjøre en rekke kontroller, ser gjennomføringen mer komplisert enn det faktisk er.

3. Fyller brukergrensesnittet

Med værdata klar til bruk, er det på tide å oppdatere brukergrensesnitt. Som jeg forklarte tidligere, oppdaterer brukergrensesnittet må skje i willActivate metoden. La oss ta en titt på gjennomføringen av denne metoden.
Styre func willActivate () {//Denne metoden kalles når klokken syn kontrolleren er i ferd med å bli synlig for brukeren super.willActivate () hvis la vær = self.weather { locationLabel.setText (weather.location) //Update Temperatur Etikett self.updateTemperatureLabel () //Update Date Etikett self.updateDateLabel ()}}

Etter å påberope seg willActivate metoden i superklassen, pakke vi verdien som er lagret i været eiendom. For å oppdatere plasseringen etiketten, påberope vi setText, passerer i verdien som er lagret på det stedet eiendom været objektet. Å oppdatere temperatur og dato etiketter, påberope vi to hjelpemetoder. Jeg foretrekker å holde willActivate metoden kort og konsis, og, enda viktigere, jeg liker ikke å gjenta meg selv.

Før vi ser på disse hjelpemetoder, trenger vi å vite om temperaturen må vises i Celcius eller Fahrenheit. For å løse dette problemet, erklærer en eiendom, celcius, av type Bool og sette sin opprinnelige verdi å true
Var celcius. Bool = true

Gjennomføringen av updateTemperatureLabel er lett å forstå. Vi trygt pakke verdien som er lagret i vær og oppdatere temperaturen etiketten basert på verdien av celcius. Som du kan se, de to hjelpemetoder av værdata strukturen vi opprettet tidligere kommer i hendig.
Func updateTemperatureLabel () {if la vær = self.weather {if self.celcius {temperatureLabel.setText (weather.toCelciusString () )} else {temperatureLabel.setText (weather.toFahrenheitString ())}}}

Gjennomføringen av updateDateLabel er ikke vanskelig heller. Vi initial en NSDateFormatter eksempel angi sin dateformat eiendom, og konvertere den datoen været objekt ved å ringe stringFromDate (_ :) på dateFormatter objektet. Denne verdien brukes til å oppdatere datoen etiketten
func updateDateLabel () {var date. NSDate = NSDate () //Initial Dato Atter la dateFormattter = NSDateFormatter () //Konfigurer Dato Atter dateFormattter.dateFormat = "d /MM HH: mm "hvis la vær = self.weather {date = weather.date} //Update Date Etikett dateLabel.setText (dateFormattter.stringFromDate (dato))}

Bygg og kjøre programmet for å se resultatet. Brukergrensesnittet skal nå fylles med data fra weather.json.

4. Bytte til Fahrenheit

Dette ser bra ut. Men ville det ikke vært flott om vi lagt til støtte for både Celsius og Fahrenheit? Dette er lett å gjøre siden vi allerede har lagt det meste av grunnarbeidet.

Hvis brukeren kraft berører brukergrensesnittet i et brukergrensesnitt kontroller, er en meny vises. Selvfølgelig, dette fungerer bare hvis en meny er tilgjengelig. La oss se hvordan dette fungerer.

Åpne Interface.storyboard og legge en meny til Interface Controller i dokument Outline til venstre. Som standard har en meny en menyelement. Vi trenger to menyelementer så legge til en annen menyelement til menyen.

Merk at menyen og sine menyelementer er ikke synlig i brukergrensesnittet. Dette er ikke et problem siden vi ikke kan konfigurere oppsettet av menyen. Hva vi kan endre er teksten i et menyelement og sitt image. Du vil bedre forstå hva det betyr når vi presenterer menyen.

Velg den øverste menyelement, åpner attributter Inspector, satt Tittel til Celcius, og bildet for å godta. Velg den nederste menyelement og satt Tittel til Fahrenheit og bilde for å godta.

Deretter åpner InterfaceController.swift i Assistant Editor til høyre. Kontroll-Dra fra den øverste menyen til InterfaceController.swift og lage en handling som heter toCelcius. Gjenta dette trinnet for bunn menyvalget, og skaper en handling som heter toFahrenheit.

Gjennomføringen av disse handlingene er kort. I toCelcius, sjekker vi om celcius eiendommen er satt til false, og hvis det er, setter vi egenskapen til sann. I toFahrenheit, sjekker vi om celcius eiendommen er satt til sann, og hvis det er, setter vi egenskapen til false.
IBAction Func toCelcius () {if self.celcius! {Self.celcius = true}} IBAction func toFahrenheit () {if self.celcius {self.celcius = false}}

Hvis verdien av celcius endringer, må vi oppdatere brukergrensesnitt. Hvilken bedre måte å oppnå dette ved å implementere en eiendom observatør på celcius eiendommen. Vi trenger bare å gjennomføre en didSet eiendom observatør
Var celcius. Bool = true {didSet {if celcius = oldValue {updateTemperatureLabel ()}}!}

Den eneste detalj verdt å nevne er at brukergrensesnittet er bare oppdatert hvis verdien av celcius ble endret. Oppdatere brukergrensesnittet er så enkelt som å kalle updateTemperatureLabel. Bygge og drive den WatchKit programmet i iOS Simulator for å teste menyen.

Det er verdt å nevne at iOS Simulator ligner responsen til en fysisk enhet. Hva betyr det? Husk at WatchKit forlengelse kjører på en iPhone mens WatchKit programmet kjører på en Apple Watch. Når brukeren taps et menyelement, er berørings hendelsen sendte over en Bluetooth-tilkobling til iPhone. Den WatchKit forlengelse behandler hendelsen og sender oppdateringer tilbake til Apple Watch. Denne kommunikasjonen er ganske rask, men det er ikke like raskt som om både utvidelse og søknaden var å kjøre på den samme enheten. Som kort forsinkelse er etterlignet av iOS Simulator for å hjelpe utviklere få en idé om ytelse.

Konklusjon

Når du har pakket hodet rundt arkitekturen i en WatchKit program, blir det mye enklere å forstå hvilke muligheter og begrensninger av den første generasjonen av WatchKit applikasjoner. I denne opplæringen, vi har bare dekket det vesentlige av WatchKit utvikling. Det er mye mer å oppdage og utforske. Følg med.



Previous:
Next Page: