Registrering af tid Sæson 2 - Lektion 5
Før jul Vi har designet og bygget en model til håndtering af en timeregistrering Vi har kigget på hvordan vi håndterer fejl Vi har kopieret koden over i Bents x-code app, klar til at bygge videre på koden.
Agenda for i aften Vi skal bygge nogle simple brugergrænserflader Vi skal ændre i Bents app så Bents uge seddel ikke er default view. Vi skal se på hvordan indtastning af data via tastaturer. Vi skal se på andre måder at taste data ind via forvalgte valgmuligheder NB!.. Det er meget muligt at vi går lidt over i aften, måske ikke når det hele.
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
Først ryder vi lidt op Hvis vi kigger i vores xcode projekt så er der nogle warnings og fejl. Vi ryder ud med hård hånd for vi kan altid tilføje mangler senere Tid til lidt oprydning i xcode
Vi skal bruge flere MVC I en app er det ikke unormalt at vi har flere MVC Derfor skal views / viewcontroller navngives så vi kan håndtere flere forskellige MVC. Og så retter vi for at fjerne de fejl det giver. Tid til at opdatere i Xcode
Nyt view til TimeEntry Vi laver et enkelt view til vores TimeEntry. Vi laver en view controller til vores TimeEntryView Vi sætter vores nye view til at være vores primære view når appen startes. Xcode tid
Hvad har vi set i xcode Vi startede med at ryde op så vi ikke havde fejl og advarsler til at forstyre os når vi arbejder. Vi oprettede et nyt view i Interface Builder (en ny scene) ved at trække den ind i MainStoryboard fra palletten Vi lavede en ny gruppe til at holde alle viewcontrollere Vi lavede en ny fil TimeEntryViewController og lavede en class som nedarver fra UIViewController, og lod filen importere UIKit i stedet for Foundation Vi flyttede pilen der peger på den gamle scene til at pege på den nye scene, og så startede vi appen og så at den startede den nye scene i stedet for den gamle
Spørgsmål Aftenskole i programmering
Interface til en enkelt tidsregistrering Vi skal vise status og type Vi skal vise datoen og gøre det muligt at indtaste den manuelt Vi skal vise og gøre det muligt at indtaste en beskrivelse Vi skal vise og gøre det muligt at indtaste en tid manuelt Vi skal vise start og stop knapper så man kan starte eller stoppe en timer Først laver vi et interface med de felter vi vil bruge
Hvad så vi i Xcode Til de elementer der kun skal vise noget bruger jeg Labels Til de elementer hvor jeg skal kunne taste noget bruger jeg tekst felter Og til knapper bruger jeg.. Knapper
Spørgsmål? Aftenskole i programmering
Der er forskel på hvad man skal taste i felter, derfor er der forskellige tastaturer i Xcode. Default, Ascii mm er til almindelig tekst Numbers and Punctuation er almindeligt tastatur med tal i fokus Aftenskole i programmering Tastaturer egenskaber på tekst felter URL er almindeligt tastatur men optimeret til at indtaste URL (web adresser) Number Pad er et numerisk tastatur Phone Pad er et telefon tastatur Name Phone Pad er et tastatur med tekst taster og telefon taster E-mail adresses er et tastatur hvor @ har fokus Decimal Pad er et numerisk tastatur hvor du skal kunne taste et kommatal Twitter er et tastatur hvor @ og # er i fokus så du nemt kan lave at og Hash Web Search er ligesom URL rettet mod at du taster i et søgefelt i en browser Ascii Capable Number Pad er et gammelt sms tastatur
Vis og Skjul tastatur Tastatur vises når et tekstfelt får fokus, men det fjernes ikke nødvendigvis automatisk igen Vi skal kode styringen af tastaturet selv.
Hvad er First responder Brugergrænsefladen skal kunne reagerer på brugernes handlinger. Tryk på en knap Slide, pinch zoome, Gøre et felt aktivt så man kan taste i det. Når en bruger udfører en handling, så udføres der en event. (der kaldes en funktion) Denne funktion kan så være implementeret flere steder i applikationen (protokoller og nedarvning) og man finder den ved at gå ned af noget der kaldes en kæde.
Responder kæden Når der opstår en event, som feks at brugeren dapper på skærmen så sendes denne event ned igennem en kæde Det første view der er under fingertrykket får som regel fokus og bliver den første der svarer på dappet (First Responder) Hvis ikke dette view griber eventen så sendes det ned i kæden indtil der er en der griber eventen, i sidste ende helt ude i applikationen. Fra Apples dokumentation
UIResponder Aftenskole i programmering Link til Apples dokumentation
Alt vedr UI nedarver fra UIResponder Stort set alt der har med view at gøre nedarver fra UIResponder. Alle visuelle kontroller som felter mm nedarver fra UIView som nedarver fra UIResponder ViewControlleren nedarver fra UIResponder Main Application nedarver fra UIResponder Det ser vi i xcode..
Tekst felt og First Responder Når et tekstfelt får fokus, og bliver first responder (når vi dapper på det) så vises tastaturet (becomefirstresponder) Når et tekstfelt ikke mere er i fokus og skal reagerer på tastetryk så holder det op med at være firstresponder (resignfirstresponder) Når feltet holder op med at være firstresponder så skjules tastaturet Det skal vi se på i xcode.
Hvad har vi set på i Xcode Vi har set at alle elementer vedrørende view nedarver fra UIResponder Vi har set at vi kan vise tastaturet ved at sætte tekstfelt viewet til first responder med becomefirstresponder. Vi har set at vi kan fjerne tastaturet ved at fjerne first responder (resignfirstresponder eller self.view.endediting) Vi kan reagerer på End on Exit, eventen på et tekstfelt som fjerner tastaturet når vi trykker Enter knappen på tastaturet (DONE knappen, for på søge tastaturet heder knappen Søg eks) Vi skal selv kode skjulningen af tastaturet hvis man dapper uden for feltet. (Vi ser på koden lige om lidt)
Spørgsmål Aftenskole i programmering
Skjul tastaturet når vi dapper uden for Der er flere forskellige hacks, til hvordan man kan skjule tastaturet når man dapper uden for. Nogen placerer en stor usynlig knap på brugergrænsefladen som dækker hele viewet, og den ligger bagerst. Responder kæden vil så sørge for at på et eller andet tidspunkt reagerer knappen på et tryk og dermed kan ma skjule tastaturet. Man kan også lade view controlleren reagere på at der er dappet ved at den overstyre en funktion fra UIResponder, touchesbegan Et dap er også det vi kalder for en Gesture
Gestures Gestures er de magiske bevægelser, vi kan anvende til touch, og hvis du søger i interfacebuilder kan du se de gestures du kan anvende Man kan tilknytte en Recognizer type til et view. Det betyder at man gør viewet i stand til at genkende at brugeren gør en af de mange gestures. Vi kan bruge Tab Gesture Recognizer på vores hoved view for at registrere at brugeren har tappet / dappet på skærmen uden for vores tekstfelt eks, og dermed reagerer og skjule tastaturet. Det skal vi se på i xcode.
Hvad så vi i Xcode, og hvad så vi ikke Vi kan vælge bare at lade viewcontrolleren gribe eventen fra UIResponder og implementere funktionen touchesbegan override func touchesbegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.hidekeyboard() } (IKKE VIST) Vi kan vælge at placere en skjult baggrundsknap på viewet som vi så lader kalde en funktion der kan skjule tastaturet. Vi kan vælge at tilknytte en tab view gesture recognizer til vores hoved view og lade den reagerer på sent action og knytte den sammen med en funktion der kan skjule tastaturet.
Hvorfor så mange muligheder? Godt spørgsmål, jeg forstår ikke selv hvorfor Apple ikke bare har indbygget dem så tastatur vises og skjules automatisk. Omvendt har du så mange muligheder for at styre dit interface selv Og som du kan se så er der ikke een regel der er den rigtige, du kan lave din helt egen måde at gøre det på.
Spørgsmål til keyboard, UIResponder, First Responder osv.
Til næste uge Prøv at kæde de andre felter mm sammen med viewcontrolleren Prøv at lege med de forskellige tastaturer. I næste uge kigger vi på hvordan vi håndterer indtastning af dato og tid og hvordan vi bruger flere views. Husk du skal ikke løse alle problemer på en gang. Leg med et problem af gangen, og løs det.
Spørgsmål? Aftenskole i programmering
Vi ses tirsdag husk at lege lidt med det, du kan ikke ødelægge noget