Watch Me Sæson 2 - Lektion 19
I sidste uge I sidste uge tog vi en lille maraton, for at få lavet version 0.5 af ugesedel appen, og lektionen blev 2.5 timer lang. Undskyld! Vi brugte tiden på: At lave en UIDatePicker som erstattede tastaturet så vi kunne sætte et tekstfelt på og styre input. At lave modellen til ugesedel viewet så den hentede timeregistrerings summer fra databasen ud for den uge som en dato indgår i At kunne få appen til at sende en e-mail (copy paste fra online dokumentationen)
Spørgsmål til sidste uge? Aftenskole i programmering
I aften Scope for de sidste 2 lektioner Grundlæggende Watch apps dele Hvordan vi får Watch ind i vores ugesedel Watch Me eksempel app vi kan eksperimentere i.
Husk at række hånden op 1. Skriv dit spørgsmål. 2. Ræk hånden op 3. Jeg holder flere spørge pauser undervejs
Scope for lektion 19 og 20 Watch delen kan sagtens i sig selv tage 20 lektioner, så vi er nød til tage en praktisk vinkel hvor i kan eksperimentere efter aftenskolen er slut. Derfor er fokus for mig at give jer noget grundlæggende watch viden de sidste 2 lektioner. For at holde det simpelt, laver vi en ny app WatchME som ikke er knyttet til vores ugesedel app Jeg viser jer dog hvordan i får Watch ind i jeres ugesedel app, så kan i senere kopiere jeres kode over fra WatchME appen når i kommer der til.
Spørgsmål til scope? Aftenskole i programmering
Grundlæggende Watch Watch er ikke en erstatning for en iphone, det er et forlængelse af en app på din iphone. Watch har et lille batteri, og er begrænset af fysisk størelse, så det er en meget begrænset enhed. (Det er selvfølgelig vildt spændende at være begrænset) Watch apps kører på uret, uden at iphonen behøver at være i nærheden. Det kræver dog en iphone for at installere appen på uret. Installation af Watch Apps foregår via Watch Appen på din iphone hvor du aktiverer apps på telefonen og fjerner dem igen. Du kan også afinstallere direkte fra uret på samme måde som du sletter apps på din iphone.
Urets hoveddele Komplikationer, på din urskive Notifikationer fra din app. Appens brugergrænseflade En hurtig launch brugergrænseflade En mere avanceret brugergrænseflade (ofte i form af et tabel view)
Komplikationer anbefales Komplikationer er ment som små ikoner der viser aktuelt info. Din trænings cirkler Vejr info mm Når man dapper på en komplikation åbnes appen. Hvis en komplikation anvendes på en urskive så holdes appen kørende i hukommelsen = hurtig launch af appen når du skal bruge den Fordi komplikationen giver værdi og som minimum kan bruges som genvej til din app så anbefaler Apple at man laver en komplikation til sin app.
Notifikationer anbefales Fordi Watch ikke er en aktive device som din iphone men noget du lyn hurtigt kigger på så anbefales det at man laver notifikationer når der er noget vigtigt at kigge på. Notifikationer og Komplikationer kæder din app sammen med watch os. De udvider uret med muligheder for at tale sammen med din app. De er et interface til din app.
En Watch App består af: Selve Watch Appen. En WatchKit Extension En iphone app. Link til dokumentation
Watch App er et Target til din ios app I vores Ugesedel app vælger du File New Target. Her vælger du WatchOS / WatchKit Her angiver du så et navn til dit produkt (din bundle) Og VIGTIGT sæt flueben i disse 2 Det viser jeg jer lige i xcode
Spørgsmål? Aftenskole i programmering
Watch Me app Vi laver en meget simpel Watch Me App til brug for oprettelse af tekst. Det kunne være tidsregistrering, det kunne være navne det kunne være alt muligt vi registrerer, så jeg har valgt at det er korte notater. Appen laver vi som en Watch OS med ios App Tid til at Create new Project in xcode.
Hvad så vi i xcode Jeg oprettede WatchMe appen. Jeg ændrede Schemaet til at være iphone 7 + 38 mm ( i kan vælge hvad i vil) Jeg kørte appen og vi fik så startet 2 simulatorer. En Watch Simulator og en iphone simulator I vores projekt er der 3 WatchMe foldere WatchMe = Ios App som vi kender det WatchMe WatchKit App = selve Watch appen (herunder interface) WatchMe WatchKit Extension = filer der bruges til at forbinde watch app med watch os. (groft fortalt)
Brugergrænsefladen Vi laver en liste (en tabel over noter) og en knap til at oprette en ny note med. Listen (Tabellen) er lidt anderledes end UITableViewController, i og med at der ikke er logik til at genbruge celler som vi kender det fra ios. En tabel er en fast tabel, og rækkerne i tabellen er strong linket. Og fordi der er begrænset ressourcer at gøre godt med så skal vi helst holde os omkring 20 rækker Tid til Xcode.
Hvad så vi i xcode En tabel indsætter en enkelt række Brugergrænsefladen (storyboardet) ligger i WatchKit App, men classerne vi linker sammen med brugergrænsefladen placerer vi i WatchKit Extension Vi lavede en Strong outlet fra vores Tabel til InterfaceController.swift classen (vores ViewController ) så vi har en tabel outlet vi kan smide output i Vi lavede en ny classe der nedarvede fra NSObject som vores note row controller skulle bruge. (NoteRow) Vi gav vores NoteRow controller (celle controller) identifier strengen tablerow, lige som du kender det fra ios. Vi oprettede en outlet til vores row i den nye NoteRow Vi oprettede en knap Ny Note Bemærk at vi ikke frit kan bestemme hvor knappen skal være. Vi oprettede en Action fra knappen til InterfaceController.swift classen, som vi kaldte createnewnote, og smed en print i den så vi kunne se at den blev kaldt.
Sammenligning ios Vi har en tableviewcontroller som nedarver fra UITableViewController WatchOS Vi har en tabelcontroller som nedarver fra WKInterfaceTable Vi har en celle i vores tabel som nedarver fra UITableViewCell Vi har en row i vores Tabel som nedarver fra NSObject Vores Celle har en identifer streng, så controller kan styre den Vores Row har en indentifier streng så vores controller kan styre den Vores viewcontroller nedarver fra UIViewController Vores InterfaceController nedarver fra WKInterfaceController
Spørgsmål? Der er lidt forskelle mellem Watch og ios udvikling, men der er også mange ligheder!
Vi smider noget dummy data i. Tabellen på Watch er statisk. Dvs der er ikke noget ReuseCellWithIdentifier ligesom vi har på ios. Man udfylder tabellen med data og så er alt data i hukommelsen så når man scroller så er det alt data der scrolles mellem Derfor anbefaler Apple omkring max 20 rækker i en tabel. For at vi kan se hvordan det kører med en Watch tabel smider vi noget dummy data i. Note 1, note 2 osv. Tid til xcode.
Hvad så vi i Xcode Aftenskole i programmering Vi skal selv fortælle hvor mange rækker vi har på tabellen Tabellen (WKInterfaceTable)har en metode der heder.rowcontroller som kan give os den controller classe der er ansvarlig for en bestemt række med det index vi ber om. Der er ikke noget Section for row at indexpath. Der er kun en meget simpel fast række tabel. Bemærk at rowlabel teksten angives med en funktion settext() og ikke bare rowlabel.text =, et spørgsmål om stil :-)
Vi smider en simpel model ind Vi skal ikke have hardcodet værdier i vores række så vi laver et array af strenge i stedet for at bruge faste værdier. Og så flytter vi logikken om at placere rækker ned i updateui() som vi kender det. Så det gør jeg lige i xcode..
Spørgsmål til den meget simple tabel
Indtastning på Watch På Watch har vi ikke et tastatur. I Watch 3 kom der et bogstave skrive system kaldt Scribble, men det fås ikke i DK endnu I stedet for at tastatur har vi nogle faste værdier, eller vi kan tale til uret som oversætter til tekst. Dette ser vi bla i messenger appen I vores WatchMe app laver vi det så man kan vælge en fast værdi, indtale sin note, eller bruge en emoji.
Tale kræver at du tester på Watch Ligesom sidste uge hvor vi ikke kunne sende en email med mindre vi kørte vores app på vores iphone, så kan du heller ikke bruge tale funktionen på uret med mindre du tester på dit ur. Modsat sidste uge, kan jeg ikke vise det for det er ikke muligt (endnu) at fange skærmen fra uret. Så i er nød til at prøve det selv hvis i vil. Løsningen er den samme som i sidste uge. Du sætter din iphone til din mac og vælger at køre appen på din iphone + Watch Det kan tage lidt tid for din mac at finde ud af at tale sammen med dit ur og sende koden over, så hav lidt tålmodighed og lås dine devices op. Hvis du får fejl, som i sidste uge, med profiler mm. Så følg den vejledning xcode giver dig.
presenttextinputcontroller WKInterfaceController har en funktion der smider en textinputcontroller op som et modalt view til input. TextInputControlleren, giver os mulighed for at vælge blandt faste værdier, indtale en tekst, vælge en emoji eller vælge en animeret emoji Metoden tager en Closure til at sætte de valgte værdier. Tid til at se på den funktion i xcode.
Hvad så vi i xcode presenttextinputcontroller, tager et array med faste værdier (dem kan vi sætte til nil En enum om hvilke features vi vil tilbyde, plain = tale, emoji og animeret emoji Completion er en closure, der som parameter skal tage et optional array (vores valgte tekst / emoji) og ikke returnerer noget Vores closure skrev vi [unowned self] <parameter> in foran, og det betyder at vi ikke holder en reference til self. [unowned self] er det vi kalder en capture liste.
Spørgsmål? Aftenskole i programmering
Til næste uge Prøv at lave koden selv, og leg med de forskellige muligheder. I stedet for note kan det være en TimeEntry beskrivelse eksempel
Planen for næste uge Kigger vi på hvordan vi laver segue på Apple Watch, så vi kan skifte til andre skærme med mere info Kigger lidt på hvordan vi kan gemme data på uret (ikke Core Data) Og så runder vi aftenskolen af.
Spørgsmål på falderebet? Aftenskole i programmering
På gensyn i næste uge. Aftenskole i programmering