Opdatering i tabellen Sæson 2 - Lektion 10
Sidste uge Sidste uge gennemgik jeg hvordan jeg kunne løse opgaven om at tiden i vores model skulle initieres til 0:00, og hvordan i kan huske at eksperimentere med koden i en playground til i finder de vise sten I lærte at designe en custom celle så vi kunne vise vores data fra vores tidsregistreringer på listeform (tabelview) I lærte om BAR (bjælker hvor man kan putte knapper og ikoner på) I lærte om at tilføje en UIButtonBarItem til vores navigation så vi kan få et + ikon i toppen af vores navigation BAR til oprettelse af en ny registrering I lærte at tilføje knappen i visual builder, eller i kode Og det betød at vi opdagede nogle ting der skal rettes i vores tidsregistreringsmodel, så det fik i som opgave til i dag.
Agenda for i aften Jeg viser jer hvordan i kunne løse opgaverne, hvilke tanker der går bag løsningerne. Jeg kan godt forstå hvis i har haft svært ved opgave 9.2 Så ser vi hvad der skal til for at vi kan rette en registrering Og hvordan vi kan slette en registrering i vores tabel view. Det kan være vi går lidt under i aften. (Ved jeg har sagt det før, nu får vi at se)
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
Opgave 9.1 Vi fandt ud af, efter vi kunne oprette flere tidsregistreringer, at beskrivelsen ikke blev gemt. Det tyder på at vi ikke får opdateret modellen med data fra vores outlet når vi er færdige med at taste beskrivelsen. Der er 2 ting i det, for vi ønsker ikke at man skal slette DESCRIPTION når man taster, og samtidig skal vi gemme vores data i vores model. Det ser vi på i xcode.
Hvad så vi i xcode omkring opg 9.1 Det med at vi skulle slette DESCRIPTION kunne rettes simpelt i Interface Builder ved at vi skiftede fra at feltet havde værdien til at vi brugte en Placeholder. Vores TimeEntryViewController, var lidt rodet så jeg fik ryddet op i den og placerede outlets, actions mm i grupper med //MARK: så det var nemmere at finde koden i oversigten. Jeg lavede en funktion som opdaterede alle tekst felter i modellen Jeg fandt alle de steder hvor tastaturet blev skjult, og sikrede mig at den kaldte updatetextfieldsinmodel funktionen som jeg lige havde lavet..
Spørgsmål til opgave 9.1 Aftenskole i programmering
Opgave 9.2 Vi fandt ud af at hvis vi trykkede start så vi start tiden i appen. Tiden skal vise 0:00 indtil den enten er indtastet eller vi har trykket stop, så vi har målt tiden. Den tid der skal vises skal være den MÅLTE eller tastede tid, og det er det ikke nu, og problemet ligger tydeligvis i Modellen for det er den der er ansvarlig for forretningslogikken altså reglerne for hvad der må og skal vises.
Problemet er at Tid = En dato Da vi valgte at lave valg af tid, fandt vi ud af at det var nemmere at bruge en Date end at arbejde med tiden alene fordi Date funktionerne bruger typen Date Men vi har designet vores model efter at kunne spørge på tiden (TimeInterval), så det skal vi have designet om. Vi er kommet til at bruge entrydate, men det er jo start dato/tid og den bør vi ikke ændre når vi ændre tiden.
Problemerne listet op entrydate må kun ændres når vi opretter instansen, og når vi ændrer datoen. time, bruger vi til at returnere tiden som sekunder, men vi sætter den aldrig ud fra sekunder. Vi sætter tiden ud fra en Date, fordi det er det UIDatePicker bruger. Der er ikke noget galt med modellen som sådan, men vi bruger den forkert, i viewcontrolleren fordi vi har haft brug for at få en Dato til vores UIDatePickerView Vi har i modellen taget hensyn til at man kan gå over flere dage i en registrering, dvs vi starter en given dato og arbejder 28 timer eksempel. 28 timer kan vi ikke indtaste i en UIDatePicker med mode =.time
Hvordan kan vi løse det? Vi skal stoppe vores viewcontroller fra at ændre entrydate når vi ændre tiden. Vi kan beslutte at vi maks tillader at registrere 24 timer (23:59) og hvis vi går over må vi lave en registrering manuelt mere eks. Version 2 kan så måske ændres til at håndtere automatisk registrering over flere dage. Hvis vi tager forudsætningen at vi ikke kan registrere over et døgn i samme registrering, kan vi udvide modellen med en logedtimeasdate property Det laver vi i xcode.
Hvad så vi i xcode om opgave 9.2 Jeg lavede en egenskab på modellen der kunne returnere og sætte tiden som en Date, for det skal vi bruge i vores UIDatePicker s Jeg ændrede delegate protokollen, så vi også havde funktioner for dato og tid. Jeg implementerede delegate protokol metoderne på TimeEntryViewController Jeg ændrede DateEditViewController til at kalde de forskellige delegate metoder afhængig af parameter typen. Herunder viewdidload så dato og tid bliver initialiseret. Jeg ændrede metoden updateui på TimeEntryViewController, til at bruge LogTimeAsDate Jeg ændrede metoden updateui på TimeEntryViewController, til at udfylde description fra modellen også. Og det samme ændrede jeg i vores custom cell, for ellers kommer det ikke tilbage til vores visning. Dermed viste det sig også at de andre værdier i modellen som status mm også blev sat
Kan i huske den her. Software udvikling er en process hvor vi hele tiden bliver klogere og retter og laver det om. Se den fulde video på youtube
Er der plads til forbedringer Det korte svar er JA. Modellen var ok, men for at viewcontrolleren måtte fungere måtte vi tage den beslutning at vi for nu ikke kan håndtere arbejdsdage over 24 timer. Der bør kigges på at man indtaster timer som 0-99 eks og minutter i eks 15,30,45,60 minutters intervaller. Hvis timer > 24 så skal der automatisk laves en ekstra registrering med samme oplysninger men over 2 dage. eks. Skal man det eller skal man holde fast i begrænsningen om maks 24 timer? Forbedringer i UI, Autolayout, mere polish, osv osv osv.
Spørgsmål til opgaven? Aftenskole i programmering
Rette en tidsregistrering Det kan laves på mange måder, men siden vi allerede har en viewcontroller hvor vi retter en registrering er et oplagt at bruge den. Når vi dapper på en celle skal vi kunne rette registreringen, ved at vi skifter til vores redigerings view. Det skal vi se på i xcode
Hvad så vi i xcode Jeg lavede en segue fra prototype cellen til TimeEntry tidsregistrering viewet. Jeg rettede prepare for segue på TimeLogTableViewController Først testede vi på segue navnet Så tog vi fat i sender (som jo må være cellen) og forsøgte at typecaste den til en TimeLogEntryViewCell Så spurgte vi TabelViewet om at give os indexpath for den celle vi havde fat i Til sidst slog vi op i vores Model på indexpath.row værdien for at få fat i vores tidsregistrering som vi så gav vores destinationvc som parameter.
Spørgsmål til opdatering af en tidsregistrering
Sletning af en registrering Det er blevet normalt at man slider en celle til venstre når man vil slette At slette har noget med data at gøre og en UITableViewController har 2 protokoller UITableViewDelegate og UITableViewDataSource Insert update og delete knytter sig til data sourcen, derfor kan det være gavnligt at se på hvad der står i online dokumentationen, så det gør vi og søger på UITableViewDataSource.
Fra dokumentationen Der er en metode der sletter med et swipe på UITableViewDataSource, som kan vise en slet knap. Men først skal vi have implementeret en sletning i vores model, så når jeg kommer med en indexpath.row kan jeg slette posten under. Det ser vi på i xcode.
Hvad så vi xcode Jeg lavede 2 funktioner på vores TimeLog candeleterow(atindex: int) deleterow(atindex: int) På den måde kan jeg teste om jeg kan slette et index, før jeg sletter (det burde ikke være et problem) Og det ser vi på nu i xcode..
Hvad så vi i xcode Vi så at vores skabelon allerede havde en slet funktion indbygget. Vi skulle bare udkommentere funktionen og implementere sletning i modellen på det index vi kommer med. Der er også funktioner til redigering af rækkefølge mm. Men det er creme og det kan altid ændres.
Status Vi kan oprette en tidsregistrering. (Insert) Vi kan rette en tidsregistrering. (Update) Vi kan slette en tidsregistrering. (Delete) Vi mangler at kunne gemme data Vi mangler at kunne lave et uge View for en given uge, men det kræver at vi kan søge i gemt data (lave et opslag i en database)
Spørgsmål til sletning? Aftenskole i programmering
Vi har set på: Modeller, Date, DateFormatter, DateComponents, Calendar, ViewControllere, Delegates, Protocols, Segues, DatePickers, NavigationBar, NavigationController, TabelController, TableCell, BarButton osv osv. Alt sammen komponenter vi har bygget på for at kunne registrere en eller flere tider. Vi skal have set på hvordan vi kan gemme data og det starter vi på i næste uge.
Til næste uge Prøv at programmere det jeg har vist jer. Har i ikke kunnet løse opgaverne så prøv at løse det med det i har set i aften.
I næste uge Det handler kun om at kunne gemme data. Der kommer en del teori i næste uge, som er nødvendigt for at forstå nogle grundprincipper omkring at gemme data.
Spørgsmål på falderebet? Aftenskole i programmering
Vi ses i næste uge. Aftenskole i programmering