Utvecklande av träningsapp för ios 7



Relevanta dokument
GYMKEEPER ANDREAS SÖDERSTRÖM

Manual C3 BMS för Android-telefoner

På sjön 2.0 Intern Guide för Android

IdrottOnline-appen Du kan installera appen från Google Play store för Android och Appstore för iphone. Sök på IdrottOnline så bör den komma fram.

5 genvägar till mer muskler

Lättlästa instruktioner för ipad ios8

Sida 1 av 12. WSB Biodling. Manual V

StoCKK Stockholm Center för Kommunikativt och Kognitivt stöd. Tips på timer-appar. Appar som hjälper dig hålla koll på tiden

Högskolan i Kristianstad. Designkoncept. Design av medietjänster för mobila enheter VT14

Copyright 2008 Pausit AB medföljer programvaran pausit. Pausit version 1.2 Användarmanual

Designspecifikation den 13 december 2007

Så får du maximal nytta av Evernote

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Manual för Kalmar kommuns Nya intranät. piren.kalmar.se

MBX Mobilapp. Inloggning. Mobilapplikationens huvudmeny. MBX Mobilapp

Classfronter Vägledning för Studenter (version 1.1)

Lumbago - Förord. Välkommen till Journalprogrammet Lumbago.

För support videos, webinstruktioner och mer information besök oss på

Projektrapport - Live commentary

Projektarbete 2: Interaktiv prototyp

Nallelek Lärarvägledning

4 proffstips för icloud

Betyg E (med tvekan) : (= Eleven beskriver mest med egna ord hur man upplevt träningen)

Översikt. Inloggning i Skola24 Schema Artiklar Frånvaro Planering Omdöme Kontakter Skola24 MobilApp. Nova Software AB 1 (19) 502

Macromedia. Flash 8 Grundkurs.

19. Skriva ut statistik

Flexibel meny i Studentportalen

Sammanställning av webbenkät december 2015

ETT ÅR MED DIN TRÄNING

En liten introduktion till SLI Community

Elisabeth Bejefalk IT-Assistent Avesta kommun

SCHOLA COMAI ELEV WEBBKALENDER / SCHEMA VERSION 1.1. [Skriv text]

Handledning för uppsatsadministratörer

Visionutveckling. Vision 80/20 för iphone. Manual Vision 80/20 för iphone. Version 2.5

Fotbollsfinter Fotbollsmaskinen: väldigt Mått på maskinen:

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Google Apps For Education

Lära känna skrivbordet

Public. Sidnr (9) Coverage Dokument id Rev? T Datum. Tillhör objekt Telia Jobbmobil Växel

Hjälp vid användning av Geodataportalen

Kom igång med Windows 8.1

Användarmanual konsult

Thomas Padron-Mccarthy Datateknik B, Mobila applikationer med Android, 7.5 hp (Distans) (DT ) Antal svarande = 18

Att komma igång med FirstClass (FC)!

Digitalt lärande och programmering i klassrummet. Introduktionsworkshop - Bygg ett akvarium i Scratch

INFORMATION FRÅN VITEC. Nyhetsbrev Vitec Marknad/Webbplats/Kundservice

Microsoft Windows 8 Grunder

Ovanliga Tips till ett Smalare Liv av Seif Fendukly Alla rättigheter förbehålls.

Sätt att skriva ut binärträd

Föreläsning 3.1: Datastrukturer, en översikt

Seriehantering. [En enkel guide för hur du som serieadministratör använder SVEMO TA.]

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

En handledning för studerande på Högskolan Kristianstad

Blogga med wordpress. Lina Tannerfalk Wiberg

Coridendro ett verktyg för att grafiskt åskådliggöra incidensen av malignt melanom inom olika släkter

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

5 genvägar till mer muskler

HexaFlip. Kravspecifikation

En liten introduktion till Community på GR-SLI

Användarmanual HOIF.org

Fysiska aktiviteter FYSISKA AKTIVITETER. Zumba och Linedance

RödGrön-spelet Av: Jonas Hall. Högstadiet. Tid: minuter beroende på variant Material: TI-82/83/84 samt tärningar

Diagram. I detta kapitel lär du dig: m Diagrammets beståndsdelar. m Att skapa både inbäddat diagram och diagramblad. m Att ändra diagramform.

Felsökning av mjukvara

Post Mortem för Get The Treasure!

Låt ipad bli fjärrkontroll för din Mac

Handledning OnTag Digitala Scorekort

Språkäventyret. Mål. Verktyg. Inledande arbete

Att använda bildhanteringsprogram, del 2

Guide till Lidingö stads app (Netpublicator) för digitala nämndhandlingar

ZoomText 10.1 Snabbguide Tillägg

Slutrapport för JMDB.COM. Johan Wibjer

Çrona Tid. Behörighetssystem. Copyright DataVara AB. Produktutveckling Morgan Klebom, Christian Elber, Hans Bäcklund, Thomas Palm

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Inledning. Att bli medlem

RSI Road Status Information A new method for detection of road conditions

Användarhandledning Rapportgenerator Version: 1.1

WINDOWS 8.1. Grunder

Skola24 för vårdnadshavare

Skapa ett register över din grupp/klass

ENKEL INTRODUKTIO Du kanske länge har funderat vad alla begrepp som Wifi, surfplatta och app står för, kanske detta dokument kan lösa dina problem.

Struktur och innehåll Laboration 2

Vis it. jquery jquery används lite överallt i appen på olika sätt. Det främsta användningsområdet är vid selektering och manipulering av HTML element.

Laborationer i kursmomentet Datoranvändning E1. Laboration nr 5: Mer om FrameMaker

Manual. Användargränssnitt

SmartgymS TRÄNA HEMMA PROGRAM SMARTA ÖVNINGAR FÖR ATT KOMMA I FORM - HEMMA! Effektiv Träning UTAN Dyra Gymkort!

Inledning. Metod. Val av maskin. Vanliga funktioner som lätt blir fel

Kommunikationsmöjligheter i Mondo

OOP Objekt-orienterad programmering

Android-app Användarmanual 1.0

MyScore Mobil Manual 1 Senaste uppdatering: 2015/11/06 Fairdeal Group Sverige AB

SEAPILOT s nya PREMIUM tjänst

Appar eller mobilwebb? Vad är bäst för bibliotekets tjänster?

Användarmanual Cartesia GEO Manager

Space Invaders - Slutrapport

2. Komma igång Skapa grupper och elever Skriv också ut sidan 13 så att eleverna har en snabbguide till programmet.

Här kan du välja befintligt upplägg eller skapa ett nytt. Klicka på edit uppe till höger för att redigera och/eller skapat nytt.

Steg 4 b. Molntjänster Onedrive Office 365 Windows 10. Mars -16 Liljedalsdata.se. Liljedalsdata Molntjänster En del av steg 4 Sida 1

ÅGIT PRESENTERAR FILR SMIDIG OCH SÄKER FILÅTKOMST OCH DELNING

Transkript:

TVE 14 022 juni Examensarbete 15 hp 13 Juni 2014 Utvecklande av träningsapp för ios 7 Gustav Forslid Håkan Wieslander

Abstract Utvecklande av träningsapp för ios 7 Developing of workout app for ios 7 Teknisk- naturvetenskaplig fakultet UTH-enheten Besöksadress: Ångströmlaboratoriet Lägerhyddsvägen 1 Hus 4, Plan 0 Postadress: Box 536 751 21 Uppsala Telefon: 018 471 30 03 Telefax: 018 471 30 00 Hemsida: http://www.teknat.uu.se/student Håkan Wieslander, Gustav Forslid Projektet gick ut på att göra en undersökning för att ta reda på hur en bra app är uppbyggd och vad folk är intresserade av för funktioner i en träningsapp. Denna undersökning skulle sedan leda fram till en app som hjälper användaren att motivera sig själv till att träna. För att programmera appar till Apples telefoner använder man sig av kodspråket Objective-C i programmeringsplattformen Xcode. Resultatet av undersökningen visade att användarvänlighet och enkel design var viktigast för uppbyggnaden av en app. Gällande intressanta funktioner för en träningsapp var statistikförande av träningen, exempel på övningar samt påminnelser om träning populära. Resultatet av projektet blev en app där användaren kan skapa olika träningspass samt se statistik över träningsutvecklingen. Handledare: Christoffer Karlsson Ämnesgranskare: Daniel Carlsson Examinator: Martin Sjödin ISSN: 1401-5757, TVE 14 022 juni

Populärvetenskaplig sammanfattning Användandet av smartphones har ökat drastiskt i världen och med det även användandet av appar. Genom att användaren själv kan välja vilka appar denna är intresserad av, kan telefonen skräddarsys utifrån användarens intressen. Samtidigt har under de senare åren en träningstrend kommit och antalet svenskar som är medlemmar på gym ökat. Dock är trenden den samma överallt: efter ett tag som medlem slutar man att gå till gymmet. Kan man utnyttja det ökade app-användandet och skapa en app som hjälper gemene man att bibehålla sin träning? Projektet gick ut på att undersöka vad som konstituerar en bra app, hur denna är utformad och vad som motiverar folk till träning. Med denna information skulle sedan en träningsapp, som dels kan motivera samt fungera som bas i träningssammanhang, skapas. Informationen om hur den optimala träningsappen såg ut samlades in genom en undersökning. Här fick folk tycka till och ge exempel på allt från utformande av appar till nya spännande användningsområden för appar inom träningssammanhang. Appen utvecklades för Apples mobiltelefoner, iphone, med operativsystemet ios 7. Den skrevs i kodspråket Objective-C och på programmeringsplattformen Xcode. Appens innehåll fokuserades på att skapa en profilsida där användaren kan skapa sina pass, en statistiksida där användaren kan se statistik över sin utveckling och en sida för att fylla i och spara data från träning. 3

Innehåll 1 Introduktion 6 1.1 Bakgrund............................... 6 1.1.1 Apple............................. 6 1.1.2 Applikationer......................... 6 1.1.3 Träning............................ 6 1.2 Projekt................................ 6 1.2.1 Frågeställning......................... 6 1.2.2 Uppgift............................ 7 1.2.3 Målsättning.......................... 7 2 Teori 7 2.1 Apputveckling............................. 7 2.1.1 ios.............................. 7 2.1.2 Xcode............................. 7 2.1.3 Objective-C.......................... 8 2.2 Träningsupplägg........................... 8 3 Metoder 8 3.1 Inledande arbete och undersökning................. 8 3.2 Meny.................................. 9 3.3 Profilsidan............................... 10 3.4 Träningssidan............................. 11 3.5 Statistiksidan............................. 11 4 Resultat 12 4.1 Undersökning............................. 12 4.2 Appen................................. 14 4.2.1 Meny............................. 14 4.2.2 Profilsidan.......................... 14 4.2.3 Träningssidan......................... 16 4.2.4 Statistiksidan......................... 18 5 Diskussion 19 5.1 Undersökningen............................ 19 5.2 Designen................................ 19 5.3 Användarvänlighet.......................... 20 5.4 Svårigheter.............................. 20 5.5 Buggar................................. 20 6 Slutsats 20 6.1 Målsättning.............................. 20 6.2 Undersökningen............................ 21 6.3 Optimering.............................. 21 6.4 Utvecklingsmöjligheter........................ 21 4

7 Appendix 24 7.1 Meny.................................. 24 7.1.1.h-fil.............................. 24 7.1.2.m-fil.............................. 24 7.2 Profilsidan............................... 26 7.2.1.h-fil.............................. 26 7.2.2.m-fil.............................. 27 7.3 Träningssidan............................. 55 7.3.1.h-fil.............................. 55 7.3.2.m-fil.............................. 56 7.4 Statistiksidan............................. 73 7.4.1.h-fil.............................. 73 7.4.2.m-fil.............................. 74 5

1 Introduktion 1.1 Bakgrund 1.1.1 Apple Apple är en av de största leverantörerna av mobiltelefoner i världen. Deras egna telefoner, Iphone, har blivit vida populära på grund av deras användarvänlighet. Apple har ett stort urval av applikationer (förkortas appar) som användare kan ta del av. Till skillnad från Androidbaserade telefoner har Apple ett eget apputvecklingssystem. De androidbaserade telefonerna använder sig av google som app-butik (Google Play) medan Apple har sin egen app-butik kallad Appstore. För att distribuera appar till Appstore behöver utvecklare vara med i Apples ios developer program. 1 Detta ger fördelen att apparna i AppStore ofta håller hög standard. Apparna till Apples telefoner grundar sig på kodspråket Objective-C. 1.1.2 Applikationer Sverige är ett av de länder, i världen, där störst andel av befolkningen innehar smartphones. Hela 78% av den svenska befolkningen hade en smartphone 2010. 2 Begreppet smartphone innebär en mobiltelefon som både kan användas som handdator och för vanlig mobiltelefoni. Det alla smartphones har gemensamt är att de använder sig av appar. Genom att användaren själv får välja vilka appar den ska ladda ner har användaren en stor möjlighet att skräddarsy sin smartphone. Utbudet av appar har växt exponentiellt de senaste åren. 2012 meddelade Apple att deras utbud av appar i Appstore uppgick till 1 miljon appar. 3 1.1.3 Träning I dagens samhälle har vi två sorters träning: styrke- och motionsträning. Man kan även dela in dessa båda i ytterligare två fack: viktminskande och viktunderhållande träning. Detta innebär att ordet träning har olika innebörd för olika människor beroende av vad de har för mål och intressen inom/med träningen. För varje år som går blir det mer och mer populärt för oss svenskar att bli medlemmar i ett gym. 2007 var det 33% av den svenska befolkningen som var medlem på ett gym eller liknande fitnesscenter. 4 1.2 Projekt 1.2.1 Frågeställning I dagsläget är det många i Sverige som har ett medlemskap på gym. Trenden är dock den samma överallt, efter ett tag som medlem slutar man gå till gymmet. Kan man med hjälp av en app motivera folk att fortsätta träna? Vad krävs av appen för att folk ska bli motiverade? Hur är en bra app uppbyggd? 6

1.2.2 Uppgift Projekter går ut på att undersöka hur en bra app är konstruerad och vad som, i en app, kan motivera folk att träna. Slutprodukten av projektet ska vara en app som kan fungera som motivation till träning och byggd efter de kriterier som definierar en bra app. Appen ska kunna föra statistik över användarens utveckling. En del fokus kommer att ligga i att användaren får bygga sin egen profil i appen. Denna kommer användas som underlag för delar av statistikförandet. 1.2.3 Målsättning Den främsta målsättningen med projektet är att få en större kunskap om utveckling och programmering av appar. I slutänden är målet att ha skapat en app som kan inspirera folk att dels börja träna samt att bibehålla motivationen att fortsätta träna. 2 Teori 2.1 Apputveckling 2.1.1 ios ios är ett operativsystem från Apple, skapat för Apples mobila enheter. Operativsystemet har ett multi-touch gränssnitt, vilket innebär att användaren kan använda sig av olika handrörelser för att använda funktioner i telefonen. Exempel på detta är att dra över skärmen (swipe) för att navigera eller knipa på skärmen (pinch) för att zooma. ios är byggt på ett ramverk som kallas Cocoa Touch. Cocoa Touch gör det möjligt för apputvecklare att kunna använda exempelvis enhetens inbyggda accelerometer och de olika rörelsemönsterna på skärmen. 5 Operativsystemet är inne på sin sjunde utvecklarversion (ios 7), och appar som utvecklas idag till ios utvecklas med fördel till den versionen. Appar till ios är skrivna i kodspråket Objective-C. 2.1.2 Xcode För att programmera appar till ios behöver man programmet Xcode som Apple erbjuder gratis från deras AppStore. Programmet är speciellt utformat för att göra det så enkelt och överskådligt som möjligt för approgrammering. Programmet fungerar på så sätt att man har en storyboard där man kan få en visuell översikt över sin app. I storyboarden kan man designa sin app genom att välja olika funktioner man vill ha, t.ex så kan man lägga till knappar och andra funktioner till olika View controllers, som är ens sidor i appen. Det finns olika typer av View controllers som är specificerade att fungera för olika saker. Exempel på detta är Table View som är en sida med en tabellfunktion. Det finns också en Navigation Controller som gör det möjligt att navigera mellan olika sidor i appen. Allt kopplas sedan samman i ens klasser- och metodkoder som man programmerar och länkar till sina View Controllers. 7

2.1.3 Objective-C Objective-C är ett objektorienterat programmeringsspråk som primärt används för att skriva appar till ios. Språket är en utveckling på det vanliga C språket, där man har lagt till syntax för att definiera klasser och metoder. 6 Vanligtvis har man en källkod eller en klassfil där variabler och metoder definieras även kallad en headerfil (.h-fil). Man behöver också en metodfil (.m-fil) eller implementationsfil där man definierar vad metoderna ska göra. 7 Det som skiljer Objective-C från vanliga C är att man använder sig av syntax från smalltalk, som är ett annan typ av objektorienterat programmeringsspråk. Inom smalltalk språket använder man dig av meddelanden som man skickar till sina objekt. Till exempel om man ska skapa en sträng och ge den ett namn kan man skriva, NSString *newstring = [NSString stringwithformat:@ Namn ]; där stringwithformat är ett meddelande man skickar till sitt NSString objekt. Man ger alltså string objektet namnet Namn. En annan del av smalltalk är att alla variabler och objekt behandlas som objekt. Detta ger fördelen att man kan skicka meddelanden till allt man har skapat, vare sig det är en instansvariabel eller ett objekt. 8 2.2 Träningsupplägg Beroende på hur man vill lägga upp sin träning på gymmet så delar man in kroppen i olika delar. Detta ger fördelen att vissa muskelgrupper inte tränas fler eller färre gånger jämfört med andra muskelgrupper. Vanligt är t.ex att man kombinerar triceps med axlar och bröst samt biceps med rygg. Anledningen till detta är att tränar man t.ex rygg så kommer även bicepsen att jobba osv. Det är inte bara vilka muskelgrupper som man tränar som styr strukturen på ens gympass. Beroende på hur man vill bygga sin kropp så kan man även anpassa hur många repetitioner och uppsättningar man kör. Repetitioner kallas reps och innebär hur många lyft man gör. Uppsättningar kallas sets och innebär hur många omgångar man utfört sina reps. Vill man bygga en stor och explosiv kropp brukar man ofta köra färre reps men fler sets. Det vanligaste som även de flesta gyminstruktörer lär ut för en nybörjare är däremot att köra fler reps t.ex 12 med 3 sets. Detta upplägg ger mer uthålliga, men inte lika stora, muskler. 3 Metoder 3.1 Inledande arbete och undersökning Projektet inleddes med studier i Objective-c och användande av Xcode. Detta gjordes genom olika gratiskurser och guider på internet. Efter att ha fått en inblick i hur Objective-c fungerade inriktades studierna mer på Xcode och kodning som är mer väsentlig mot apputveckling. Den största delen av dessa studierna gick ut på att programmera olika typer av enkla appar från diverse guider på bland annat Youtube. 8

För att kunna göra en så bra app som möjligt genomfördes en undersökning där ca. 40 personer fick svara på diverse frågor om appar och träning. Urvalsgruppen för undersökningen var främst studenter i 20-30 års åldern. Frågorna var av typen, Hur ofta tränar du på gym, Använder du någon typ av träningsapp i dagsläget, Vilka funktioner är bra i appar du använder och Vilken form av statistik skulle du vara intresserad av i en träningsapp. 3.2 Meny För att få en snygg meny användes en så kallad Slide out menu, alltså en meny som kommer fram från sidan av telefonen då användaren antingen drar ut den med fingret på skärmen eller trycker på Meny -knappen. För att få till en sådan meny behöver man använda sig av ett externt bibliotek, i detta fallet användes ett bibliotek som heter SWReveal. 9 SWReveal kommer med en.h-fil och en.m-fil med metoder som kan användas och implementeras till ens egna filer. Där finns till exempel metoder som används för att säga till telefonen att, när en knapptryckning eller ett rörelsemönster inleds ska menyn komma fram. Först kopierades SWreveal filerna in i projektet för att kunna använda dess funktioner. Därefter skapades en Navigation Controller som har hand om hur navigationen mellan appens sidor är kopplade och en Table View för att få en snygg meny i tabellform. Navigation Controllern och Table Viewn kopplades med ett reveal view controller -kommando så att dessa visas när en knapptryckning eller gest sker. För Navigation Controllern sattes identifikationen till front och för table view till rear. Detta ger att table view hamnar inuti Navigation Controllern och blir därför utseendet på menyn. För att konstruera menyn användes tre stycken View Controllers, en för profilsidan, en för statistiksidan och en som är startsida och sida där användaren kan starta sin träning. För var och en av dessa skapades en.h-fil och en.m-fil. I Table Viewn lades det till tre stycken labels som skulle fungera som knappar, beroende på vilken label man tryckte på skulle användaren komma till respektive View Controller som var kopplad till den knappen. I var och en av de skapade View Controllers skapades en navigation bar, på toppen av skärmen, där menyknappen placerades. För varje view controller som skapades implementerades en kod för att, vid knapptryckning på menyknappen, ska menyn komma fram; sidebarbutton.target = self.revealviewcontroller; sidebarbutton.action = @selector(revealtoggle:); där siderbarbutton är namnen på menyknappen. Den översta kodbiten beskriver vilket mål som knapptryckningen kommer medföra, alltså att Navigation Controllern kommer anropas. Den undre kodbiten beskriver vilken metod som tillkallas vid knapptryckningen. Metoden som används kallas revealtoggle och är en av metoderna som kommer med SWReveal biblioteket. Metoden ger en snygg animerad utdragning av sidomenyn. 9

3.3 Profilsidan Profilsidan är grundstenen i appen. Här skapar användaren de olika passen och passens tillhörande övningar. Utan dessa går resterande funktioner ej att använda. Till en början skapades fyra stycken textfields, i dessa kan användaren skriva in namnen på de olika pass de vill ha. Till varje textfield lades det till en knapp med namnet create. För varje knapp skrevs det en metod som skapar en NSmutableArray. NSmutableArray är en array där man inte behöver specificera hur många objekt som ska ligga i denna. För att göra det så enkelt som möjligt lades passnamnet in på första platsen i respektive array. Därefter sparades arrayen och dess innehåll med hjälp av NSUserDefaults. Fastän man stänger av appen helt sparar NSUserDefaults informationen man lagrat. Simultant som det skapades en NSMutableArray hoppar appen in i en ny sida. På denna sida skapades 8 nya textfields. I dessa skriver användaren in namnen på de övningar denna vill lägga till i sitt pass. Även här har varje textfield varsin knapp med en metod som sparar de övningar som har skrivits in. I detta fall har knapparna döpts till save. För dessa knappar skapas det nya NSMutableArray för varje gång användaren trycker på knappen. Namnet på övningen hamnar på första plats i listan, och dessa arrayer lades till i den första array som skapades till det passet användaren lägger till övningar i. Anledning att namnet på passen och på övningar läggs till på första platsen i respektive array är för att man enkelt, i de andra sidorna, ska kunna veta vad användaren döpt allt till. För att inte användaren ska kunna av misstag ändra passnamn och övningsnamn så sker ytterligare en process vid tryck av create och save knapparna. De textfields där namnen skrivits in görs om till labels med samma text som det döpta passet, vilket innebär att de inte längre går att ändra namn på passet. Har användaren skapat 4 olika pass samt 8 övningar i respektive pass blir detta alltså 32 stycken olika labels samt 12 stycken olika knappar. För att förenkla kontrollen av dessa så användes ett system för att taga allt. Att ett objekt får en tag innebär egentligen att den får ett id-nummer. Dessa idnummer användes sedan för att kunna identifiera vad som skapats. Första gången användaren kommer in på profilsidan finns enbart ett textfield och en create knapp. Alltså har resterande textfields och knappar tagits bort med hjälp av if-satser och for-loopar som kontrollerar objektens id-nummer och tar bort det överflödiga. På grund av att användaren ska få bestämma hur många pass denna vill ha och för att appen tar bort överflödiga knappar, lades det till två extra knappar. Dessa knappar fick båda symbolen av ett plustecken, båda kopplades ihop så att tryck på dessa genererar ett nytt textfield och en ny knapp. Det första plustecknet reglerar möjligheten för användaren att skapa nytt pass och det andra reglerar att lägga till ytterligare övningar inuti passen. Sist skapades en knapp med namnet reset, denna fick en metod som innebar att användaren nollställde alla arrayer som skapats. Efter att ha tryckt på denna åtgår alltså profilsidan till den ursprungliga formen och ger användaren möjlighet att skapa nya pass med nya övningar. 10

3.4 Träningssidan Träningssidan är den första sidan användaren möter när appen startas. På träningssidan ska användaren kunna registrera hur många sets, reps och vilken vikt denna har använt. Det första som skapades var en stor knapp i mitten av skärmen med texten New workout, klickar användaren på denna ska denna kunna se sina skapade pass. New workout -knappen kopplades till en metod som hämtar de sparade arrayerna och går igenom vilka som har något innehåll. För att hämta den sparade informationen från appens minne användes standarduserdefaults. 10 Fyra knappar och en label lades till och antalet knappar som var synliga efter att användaren klickat på New workout bestämdes med hjälp av hur många arrayer som hade något innehåll. Knapparna döptes till namnen som låg sparade i arrayerna och kopplades till fyra olika metoder. Det första i de fyra metoderna var att sätta en text på labeln, denna text var namnet på passet. Efter detta skapades en label med namnet på övningen och tre textfields där användaren kan fylla i sets, reps och tyngd. Detta gjordes med en for -sats som gick igenom arrayen för passet och skapade så många labels och textfields som det fanns övningar i sparade. För att spara värdena i textfieldsen skapades en save knapp. Save knappen multiplicerade ihop värdena i de olika textfieldsen för de respektive övningarna och sparade produkten i arrayen för övningen. Denna arrayen sparades sedan över i arrayen för passet och allt sparades sedan i appens minne. 3.5 Statistiksidan För att kunna rita grafer i appen användes ett externt bibliotek som heter Core Plot. 11 För att implementera Core Plot i Xcode behöver man lägga till en mapp med ett antal.h-fil med definitioner som används för animationer och grafiskt utnyttjande av skärmen. Core Plot använder sig av ett ramverk som Apple tillhandahåller som heter Quartz Core som gör det möjligt med bildbearbetning. 12 Quartz Core länkades in så att det kunde användas till alla bibliotek. Efter att Core Plot var implementerat i projektfilen började den grafiska utvecklingen av statistiksidan. För att användaren skulle få en så enkel och snygg översikt som möjligt bestämdes det att användaren först ska komma till en sida med knappar som är döpta efter användarens pass. De olika arrayerna där användaren sparat sina pass hämtades från minnet och fyra knappar skapades. De fyra knapparnas text ändrades med hjälp av namnen på användarens pass. Detta gjordes med hjälp av if -satser som kollar om de hämtade arrayerna är tomma, var någon array tom så gömdes de knapparna. Användaren får alltså bara upp så många knappar som den har skapat pass. När användaren sedan klickar på en knapp ska det komma upp ett nytt antal knappar med användarens övningar. 8 knappar skapades och döptes på samma sätt med hjälp av de olika arrayerna. Nästa steg var att få fram en graf över värdena användaren lagt i arrayerna. 11

För detta skapades först en metod som kallades graph. Denna metoden skulle tillkallas för att rita en graf med användarens värden på skärmen. Det första i metoden var att lägga en View på skärmen som kan hantera en graf. Sedan skapades en tom graf som lades till på skärmen. För att kunna bestämma x- och y-koordinaternas räckvidd skapades ett utrymme för hur mycket plats den faktiska grafen får använda av Viewen. X-koordinatens räckvidd sattes till längden på den arrayen man ville plotta plus 1 så att grafen inte slutade i kanten av skärmen. Y-koordinatens räckvidd sattes till det maximala värdet i arrayen plus det maximala värdet delat på 10. Detta för att få en snygg y-axel som täcker in hela grafen plus lite till. För att ha några värden att plotta på grafen skapades en metod som tar ut data till plotten. I denna metoden fördes alla värden över från arrayen med övningen som användaren var intresserad av och över till en ny array. I den nya arrayen hade namnet på övningen tagits bort, denna array innehöll bara data. Core Plot använder sig av två metoder för att plotta datan, en som räknar ut hur många värden som ska plottas och en som tar fram datan för x- och y-koordinaten. Dessa metoder tillkallas automatiskt när graph-metoden körs. I den första metoden gjordes en räkning av hur många värden som fanns i arrayen med data. I den andra gjordes en if -sats som gick igenom x- och y-koordinaterna och plottade dessa. 4 Resultat 4.1 Undersökning Resultatet av undersökningen gav följande svar: (a) Är du i dagsläget medlem i ett gym? (b) Om du är medlem i ett gym i dagsläget hur ofta går du dit i veckan? (c) Använder du i dagsläget någon träningsapp? Figur 1: Statistiska frågor från undersökningen Om du använder en träningsapp i dagsläget vilka funktioner uppskattar du i dessa? 12

I princip alla svarade att den funktion som var mest uppskattad var någon form av statistikförande funktion. Många ville även ha push-up notiser som påminner dem att gå att träna, kaloriräknare samt tips på olika övningar. Vilken form av statistik skulle du vara intresserad av att kunna få fram i en träningsapp? På denna fråga var det fokus på två olika saker. En del fokuserade på sin vikt och ville då kunna se sin kroppsvikt i en graf samt kunna skriva in deras kaloriintag och räkna ut hur mycket kalorier de bränner. Den andra halvan hade fokus på den personliga utvecklingen. De önskade grafer för hur deras styrka i olika övningar har utvecklats, även en funktion som beräknade deras träningsfrekvens. Vilka funktioner skulle du bli motiverad att träna i en app? Även här var de svarande enade om att statistik var de absolut bästa sättet att bli motiverad. Många trodde även på träningsplanering där träningen schemalades veckovis. Som motivation kunde man använda sig av påminnande push-up notiser som skickades till användaren. Ett fåtal var intresserade i att appen skulle erbjuda tips på olika övningar. Hur är en bra app utformad rent användarmässigt? De svarande var eniga, de vill ha appar som är lättmanövrerade och enkla att använda. Gärna stora knappar och inte för många komplicerade funktioner. Några la även fokus på att designen skulle vara trevlig och höra ihop med operativsystemet. Finns det något mer som du skulle villja att din träningsapp innehöll? Denna fråga gav folk fritt tänkade och svaren var väldigt varierande. Träningsdagbok Stretching-tips Tips på hur man kan utveckla sig själv Använda den för löpning Samla poäng och tävla mot vänner Färdiga exempel på olika pass att dela upp kroppen i Förslag på näringsrik mat, recept Personligt schema 13

4.2 Appen 4.2.1 Meny Det främsta resultatet av att skapa en användarvänlig app blev en slide out menu som går att nå från alla sidor i appen (Figur 2). (a) Meny indragen (b) Meny utdragen Figur 2: Jämförelse av startsidan i appen 4.2.2 Profilsidan Första gången användaren kommer in på profilsidan får denna skapa sina pass (Figur 3). Figur 3: Profilsidan då inga pass är skapade Efter att användaren skrivit in namnet på sitt pass flyttas denna vidare till en sida där användaren kan fylla i namnen på sina övningar (Figur 4). 14

(a) Inga övningar tillagda till passet (b) Två övningar tillagda till passet och möjlighet att lägga till fler (c) Skapande av en tredje övning Figur 4: Efter att ett pass är skapat läggs övningar till i passet Efter att användaren skapat så många övningar som behövs trycker denna på spara och kommer då tillbaka till sidan för att skapa flera pass (Figur 5). (a) Ett pass skapat med möjlighet att lägga till ett till Figur 5: Profilsidan med skapade pass (b) Fyra pass skapade och profilen är full, möjlighet att rensa allt 15

4.2.3 Träningssidan Träningssidan är den första sidan användaren möter när appen startas, den går även att nå från menyn (Figur 6). Figur 6: Träningssidans första vy Efter att tryckt på New Workout kommer användaren till en sida för att välja pass (Figur 7). Figur 7: Val av pass att träna 16

När passet är valt kan användaren börja fylla i antal sets, reps och vikt denna har tränat med (Figur 8). (a) Här kan användaren fylla i vad denna tränat (b) Beskrivning av hur användaren fyller i värden på övningarna Figur 8: Sida för att fylla i under träningen Efter ett avslutat pass klickar användaren på save och träningen är slut (Figur 9). Figur 9: Avslutad träning 17

4.2.4 Statistiksidan På statistiksidan ser användaren hur träningen utvecklas. Det första användaren möts av är möjligheten att välja vilket pass denna vill se statistik över (Figur 10). Figur 10: Första sidan där användaren väljer vilket pass denna vill se statistik över Efter val av pass får användaren välja vilken övning som denna vill se statistik över (Figur 11). Figur 11: Val av övning användaren vill se statistik över 18

Slutgiltligen får användaren se en kurva över hur utvecklingen på vald övning ser ut (Figur 12). Figur 12: Kurva över träningsutvecklingen för en vald övning 5 Diskussion 5.1 Undersökningen Av de 42 personerna som svarade på undersökningen var det hela 31 personer som var medlemmar på ett gym. Detta speglar tyvärr inte verkligheten då det i Sverige enbart är 33% av befolkningen som är medlem på gym. Urvalsgruppen var studenter i 20-30 års åldern, vilket förmodligen är en samhällsgrupp som tränar mer än andra. Detta är inte enbart negativt utan positivt i den aspekten att de som svarade redan hade stor vetskap om träning på gym. Det negativa blir att den målgrupp som söktes som inte tränade på gym men ville bli motiverade av appen inte fick säga sitt. Bortsett från om de inte tränade eller tränade så var resultatet bra. De svarande beskrev tydligt och klart vad de gillade och inte gillade i både vanliga appar och träningsappar. 5.2 Designen Designen av appen blev väldigt enkel. På de flesta sidorna har användaren enbart ett fåtal knappar att trycka på vilket gör helheten väldigt enkel på appen. Valet av färgkombinationer gjordes så att de skulle passa bra med Apples egna gränssnitt. Designen av menyn finns i flera andra appar vilket gör att användaren lätt kan förstå hur allt funkar. Knapparna gjordes tydliga, med bra kontrast mot bakgrunden, för att allt skulle bli så tydligt som möjligt. 19

5.3 Användarvänlighet Användarvänligheten återfinns främst i den meny som skapades. För att få funktionerna inuti appen att bli så användarvänliga som möjligt användes så få knappar som möjligt. Detta gjorde att navigationen mellan sidorna blev väldigt enkel. Tanken var att användaren alltid bara skulle vara ett knapptryck ifrån nästa steg. 5.4 Svårigheter Den främsta svårigheten med projektet var att använda sig av Objective-C och Xcode. Eftersom det inte fanns någon vana av dessa två innan projektets start behövdes mestadels av tiden läggas på att lära sig dessa. När projektet startade hade Apple nyligen släppt en ny version av sitt operativsystem, ios och många kommandon i Xcode hade uppdaterats. Detta gav svårigheter att finna lösningar till de problem som uppstod då de flesta lösningarna var till äldre versioner av Xcode och ios. Ett problem i själva utvecklingsstadiet var att använda taggar till textfields och labels. Problemet var att om två objekt fick samma tag blev den ena utan, vilket skapade problem att gömma dessa. Ett annat problem var användningen av Core Plot. De beskrivningarna som fanns för detta bibliotek var väldigt komplicerade och det tog lång tid att tolka hur det skulle användas. 5.5 Buggar I nuläget innehåller appen två buggar. Den första buggen inträffar i det fallet användaren skulle döpa alla sina pass till exakt samma sak. Då kommer appen lägga in alla övningar för alla pass med samma namn i det första skapade passet. Den andra buggen inträffar då användaren skapar ett pass utan att lägga till några övningar. Trycker sedan användaren på New workout och in på det tomma passet kommer appen att crasha. Båda dessa buggar kommer förmodligen aldrig användaren stöta på, då sannolikheten är låg att appen används på detta sätt. Det är på grund av tidsbrist som dessa buggar ej är åtgärdade. Vid officiellt släpp av appen skulle dessa behöva åtgärdas. Eventuellt kan appen innehålla andra buggar som ej upptäckts. 6 Slutsats 6.1 Målsättning Målsättningen för projektet var att få en större kunskap om utveckling och programmering av appar. Med hjälp av en undersökning har kunskapen om hur en bra app är utvecklad ökat. Detta kan användas som bas i vidare projekt. När projektet startade fanns inga förkunskaper om Objective-C och Xcode. Under projektets gång har dessa ökat drastiskt och resulterat i en fungerande app med 20

möjligheter för statistikförande, profilskapande och datasparande. Eftersom appen ej är publicerad för allmänheten är det svårt att säga om målet att skapa en motiverande app är uppfyllt. Det som går att säga är att appen som skapas är enkel och lättmanövrerad och har en möjlighet att föra statistik över träning. Dessa två egenskaperna var en stor del av vad undersökningen gav för resultat. 6.2 Undersökningen Det främsta resultatet vid sammanställningen av frågorna i undersökningen, i mån om vad folk gillar i appar, är användarvänlighet. De svarande var entydiga med att komplicerade funktioner och onödiga moment enbart gjorde dem mindre intresserade av att använda appen. Det beskrevs också tydligt att designen och färgvalet skulle vara trevligt och vissa tyckte även att det skulle följa operativsystemets design. I den andra delen av undersökningen frågades det om olika funktioner i en träningsapp som kunde hjälpa användaren att motiveras. Här var det olika former av statistik som var mest eftertraktat så som träningsfrekvens, viktkurva och styrkekurva. Många gillade även idéen att appen skickade ut s.k push notiser till användaren som påminde denna om att träna. 6.3 Optimering Det finns stora optimeringsmöjligheter i programkoden. För optimering av koden krävs dock ett stort arbete och mer kunskap, vilket på grund av tidsbrist ej har hunnits med. Vid en eventuell lansering av appen hade vissa delar av koden behövt förenklas eftersom appen drar onödigt mycket minne som det ser ut nu. 6.4 Utvecklingsmöjligheter För att utveckla appen ytterligare, utifrån vad undersökningen gav, skulle dels vara att lägga in en funktion som gör det möjligt för användaren att planera sin träning samt lägga till funktionen push-up notiser som kan påminna användaren om att träna. Man hade kunnat skapa ett poängsystem för användaren beroende på hur dess träningsutveckling har gått samt om användaren följer sin träningsplanering. Detta poängsystem hade man sedan kunnat följa online där användaren tävlade mot andra användare. En tredje nisch hade kunnat vara att fokusera på kost och kalorier. Där hade appen kunnat ha en kalorieräknare som dels räknade ut hur mycket kalorier användaren stoppar i sig och hur mycket den förbränner. Även att appen kunnat tipsa om nyttiga och nytänkande maträtter. 21

Referenser [1] Apple, Distribute. https://developer.apple.com/programs/ios/distribute.html, 2014. (Hämtad 23 maj, 2014). [2] www.teknologin.se, Svenskar använder smartphones mest. http://www.teknologin.se/index.php/artiklar/svenskar-anvandersmartphones-mest/, 2013. (Hämtad 23 maj, 2014). [3] N. Ingraham, Apple announces 1 million apps in the App Store. http://www.theverge.com/2013/10/22/4866302/apple-announces- 1-million-apps-in-the-app-store, Oktober 2013. (Hämtad 23 maj, 2014). [4] SCB, Personer 16-84 år som på fritiden ägnat sig åt tränat på gym, träningscenter, fitnesscenter under de senaste 12 månaderna 2006-2007. http://webcache.googleusercontent.com/search?q=cache:2atms7xfq9yj: www.scb.se/statistik/le/le0101/ documents/tabell, 2007. (Hämtad 28 April, 2014). [5] Apple, cocoa touch frameworks. https://developer.apple.com/technologies /ios/cocoa-touch.html, 2014. (Hämtad 21 April, 2014). [6] Apple, About Objective-C. https://developer.apple.com/library/mac/ documentation/cocoa/conceptual/programmingwithobjectivec/introduction /Introduction.html, 2014. (Hämtad 21 April, 2014). [7] Apple, Defining Classes. https://developer.apple.com/library/mac/ documentation/cocoa/conceptual/programmingwithobjectivec/definingclasses/ DefiningClasses.html#//apple ref/doc/uid/tp40011210-ch3-sw1, 2014. (Hämtad 21 April, 2014). [8] Wikipedia, Smalltalk. http://en.wikipedia.org/wiki/smalltalk, 2014. (Hämtad 21 April, 2014). [9] John-Lluch, John-Lluch/SWRevealViewController. https://github.com/john-lluch/swrevealviewcontroller, 2014. (Hämtad 14 maj, 2014). [10] Apple, NSUserDefaults Class Reference. https://developer.apple.com/library/mac/documentation/cocoa/reference /Foundation/Classes/NSUserDefaults Class/Reference/Reference.html#// apple ref/occ/clm/nsuserdefaults/standarduserdefaults, 2014. (Hämtad 22 maj, 2014). [11] core plot, core-plot/core-plot. https://github.com/core-plot/core-plot, 2014. (Hämtad 22 maj, 2014). 22

[12] Apple, Quartz Core Framework Reference. https://developer.apple.com/library/mac/documentation/graphicsimaging /reference/quartzcorerefcollection/ index.html, 2014. (Hämtad 22 maj, 2014). 23

7 Appendix 7.1 Meny 7.1.1.h-fil #import <UIKit/UIKit.h> @interface SidebarTableViewController : UITableViewController @property (nonatomic, strong) NSArray *menuitems; @end 7.1.2.m-fil #import "SidebarTableViewController.h" #import "SWRevealViewController.h" @interface SidebarTableViewController () @end @implementation SidebarTableViewController - (id)initwithstyle:(uitableviewstyle)style { self = [super initwithstyle:style]; if (self) { // Custom initialization return self; - (void)viewdidload { self.view.backgroundcolor = [UIColor colorwithwhite:0.2f alpha:1.0f]; self.tableview.backgroundcolor = [UIColor colorwithwhite:0.2f alpha:1.0f]; self.tableview.separatorcolor = [UIColor colorwithwhite:0.15f alpha:0.2f]; _menuitems = @[@"title", @"New workout", @"profile", @"statistics"]; [super viewdidload]; 24

- (void)didreceivememorywarning { [super didreceivememorywarning]; #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableview { return 1; - (NSInteger)tableView:(UITableView *)tableview numberofrowsinsection :(NSInteger)section { return [self.menuitems count]; - (UITableViewCell *)tableview:(uitableview *)tableview cellforrowatindex Path:(NSIndexPath *)indexpath { NSString *CellIdentifier = [self.menuitems objectatindex:indexpath.row]; UITableViewCell *cell = [tableview dequeuereusablecellwithidentifier :CellIdentifier forindexpath:indexpath]; return cell; - (void)tableview:(uitableview *)tableview willdisplaycell:(uitableviewce ll *)cell forrowatindexpath:(nsindexpath *)indexpath{ [cell setbackgroundcolor:[uicolor colorwithwhite:0.2f alpha:1.0f]]; #pragma mark - Navigation - (void)prepareforsegue:(uistoryboardsegue *)segue sender:(id)sender { NSIndexPath *indexpath = [self.tableview indexpathforselectedrow]; UINavigationController *destviewcontroller = (UINavigationController 25

*)segue.destinationviewcontroller; destviewcontroller.title = [[_menuitems objectatindex:indexpath.row] capitalizedstring]; if ( [segue iskindofclass: [SWRevealViewControllerSegue class]] ) { SWRevealViewControllerSegue *swsegue = (SWRevealViewControllerSeg ue*) segue; swsegue.performblock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) { ; UINavigationController* navcontroller = (UINavigationControll er*)self.revealviewcontroller.frontviewcontroller; [navcontroller setviewcontrollers: @[dvc] animated: NO ]; [self.revealviewcontroller setfrontviewposition: FrontViewPos itionleft animated: YES]; @end 7.2 Profilsidan 7.2.1.h-fil #import <UIKit/UIKit.h> #import "ViewController.h" @interface ProfileViewController : UIViewController{ IBOutlet UIButton *plus; int x; int z; int y; int q; int p; int w; IBOutlet UIButton *create1; IBOutlet UIButton *create2; IBOutlet UIButton *create3; 26

IBOutlet UIButton *create4; IBOutlet UIButton *plus2; IBOutlet UIButton *reset; IBOutlet UIButton *save1; IBOutlet UIButton *save2; IBOutlet UIButton *save3; IBOutlet UIButton *save4; IBOutlet UIButton *save5; IBOutlet UIButton *save6; IBOutlet UIButton *save7; IBOutlet UIButton *save8; -(IBAction)plus:(id)sender; -(IBAction)create1:(id)sender; -(IBAction)create2:(id)sender; -(IBAction)create3:(id)sender; -(IBAction)create4:(id)sender; -(IBAction)plus2:(id)sender; -(IBAction)save:(id)sender; -(IBAction)reset:(id)sender; @property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarbutton; @property (weak, nonatomic) IBOutlet UIBarButtonItem *rightsidebarbutton; @end 7.2.2.m-fil #import "ProfileViewController.h" #import "SWRevealViewController.h" @interface ProfileViewController () @end @implementation ProfileViewController -(IBAction)plus:(id)sender;{ if (x<5) { UITextField *position = (UITextField*)[self.view viewwithtag: x-1]; 27

CGRect labelframe = CGRectMake( 20, position.frame.origin.y + 50, 189, 20 ); UITextField* textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name workout session"; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = x; [self.view addsubview: textfield]; switch (z) { case 2: create1.hidden=yes; create2.hidden=no; create3.hidden=yes; create4.hidden=yes; case 3: create1.hidden=yes; create2.hidden=yes; create3.hidden=no; create4.hidden=yes; case 4: create1.hidden=yes; create2.hidden=yes; create3.hidden=yes; create4.hidden=no; default: plus.hidden=yes; x = x+1; -(IBAction)plus2:(id)sender;{ if (y<13) { 28

UITextField *position = (UITextField*)[self.view viewwithtag: y -1]; CGRect labelframe = CGRectMake( 20, position.frame.origin.y + 50, 189, 20 ); UITextField* textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = y; [self.view addsubview: textfield]; switch (y) { case 6: save1.hidden=yes; save2.hidden=no; case 7: save1.hidden=yes; save2.hidden=yes; save3.hidden=no; case 8: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=no; case 9: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=no; case 10: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=no; case 11: save1.hidden=yes; save2.hidden=yes; 29

save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=no; case 12: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=yes; save8.hidden=no; default: y = y+1; if (q<21) { UITextField *position = (UITextField*)[self.view viewwithtag: q -1]; CGRect labelframe = CGRectMake( 20, position.frame.origin.y + 50, 189, 20 ); UITextField* textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = q; [self.view addsubview: textfield]; switch (q) { case 14: save1.hidden=yes; save2.hidden=no; case 15: save1.hidden=yes; 30

save2.hidden=yes; save3.hidden=no; case 16: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=no; case 17: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=no; case 18: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=no; case 19: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=no; case 20: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=yes; save8.hidden=no; default: 31

q = q+1; if (p<29) { UITextField *position = (UITextField*)[self.view viewwithtag: p -1]; CGRect labelframe = CGRectMake( 20, position.frame.origin.y + 50, 189, 20 ); UITextField* textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = p; [self.view addsubview: textfield]; switch (p) { case 22: save1.hidden=yes; save2.hidden=no; case 23: save1.hidden=yes; save2.hidden=yes; save3.hidden=no; case 24: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=no; case 25: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=no; case 26: save1.hidden=yes; save2.hidden=yes; 32

save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=no; case 27: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=no; case 28: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=yes; save8.hidden=no; default: p = p+1; if (w<37) { UITextField *position = (UITextField*)[self.view viewwithtag: w -1]; CGRect labelframe = CGRectMake( 20, position.frame.origin.y + 50, 189, 20 ); UITextField* textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = w; [self.view addsubview: textfield]; 33

switch (w) { case 30: save1.hidden=yes; save2.hidden=no; case 31: save1.hidden=yes; save2.hidden=yes; save3.hidden=no; case 32: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=no; case 33: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=no; case 34: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=no; case 35: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; save6.hidden=yes; save7.hidden=no; case 36: save1.hidden=yes; save2.hidden=yes; save3.hidden=yes; save4.hidden=yes; save5.hidden=yes; 34

save6.hidden=yes; save7.hidden=yes; save8.hidden=no; default: w = w+1; plus2.hidden=yes; -(IBAction)create1:(id)sender;{ create1.hidden=yes; create2.hidden=yes; create3.hidden=yes; create4.hidden=yes; plus.hidden = YES; save1.hidden=no; reset.hidden=yes; q=38; p=38; w=38; UILabel *label = [[UILabel alloc] initwithframe:cgrectmake(20, 90, 280, 30)]; UITextField *textfieldtext = (UITextField*)[self.view viewwithtag:1]; label.text = [NSString stringwithformat:@"\%@", textfieldtext.text]; label.tag = 100; [label settextalignment:nstextalignmentcenter]; [self.view addsubview:label]; for (int i = 1; i<x; i++) { UITextField *hidefield = (UITextField*)[self.view viewwithtag: i] ; hidefield.hidden=yes; y=5; CGRect labelframe = CGRectMake( 20, 180, 189, 20 ); UITextField *textfield = [[UITextField alloc] initwithframe: 35

labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = y; [self.view addsubview: textfield]; y=y+1; NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; NSMutableArray *array1 = [[NSMutableArray alloc] init]; [array1 addobject:[nsstring stringwithformat:@"%@", textfieldtext.text]]; [defaults setobject:array1 forkey:@"array1"]; [defaults synchronize]; _rightsidebarbutton = self.navigationitem.rightbarbuttonitem = [[UIBarButtonItem alloc] initwithtitle:@"done" style:uibarbuttonitems tylebordered target:self action:@selector(done:)]; for (int i = 201; i<221; i++) { UILabel *label = (UILabel*)[self.view viewwithtag: i]; label.hidden=yes; -(IBAction)create2:(id)sender;{ create1.hidden=yes; create2.hidden=yes; create3.hidden=yes; create4.hidden=yes; plus.hidden = YES; save1.hidden=no; reset.hidden=yes; y=38; p=38; w=38; UILabel *label = [[UILabel alloc] initwithframe:cgrectmake(20, 90, 280, 30)]; UITextField *textfieldtext = (UITextField*)[self.view viewwithtag:2]; label.text = [NSString stringwithformat:@"\%@", textfieldtext.text]; label.tag = 101; [label settextalignment:nstextalignmentcenter]; [self.view addsubview:label]; 36

for (int i = 1; i<x; i++) { UITextField *hidefield = (UITextField*)[self.view viewwithtag: i] ; hidefield.hidden=yes; q=13; CGRect labelframe = CGRectMake( 20, 180, 189, 20 ); UITextField *textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = q; [self.view addsubview: textfield]; q=q+1; NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; NSMutableArray *array2 = [[NSMutableArray alloc] init]; [array2 addobject:[nsstring stringwithformat:@"%@", textfieldtext.text]]; [defaults setobject:array2 forkey:@"array2"]; [defaults synchronize]; _rightsidebarbutton = self.navigationitem.rightbarbuttonitem = [[UIBarButtonItem alloc] initwithtitle:@"done" style:uibarbuttonitems tylebordered target:self action:@selector(done:)]; for (int i = 201; i<221; i++) { UILabel *label = (UILabel*)[self.view viewwithtag: i]; label.hidden=yes; -(IBAction)create3:(id)sender;{ create1.hidden=yes; create2.hidden=yes; create3.hidden=yes; create4.hidden=yes; plus.hidden = YES; save1.hidden=no; reset.hidden=yes; q=38; y=38; w=38; UILabel *label = [[UILabel alloc] initwithframe:cgrectmake(20, 90, 37

280, 30)]; UITextField *textfieldtext = (UITextField*)[self.view viewwithtag:3]; label.text = [NSString stringwithformat:@"\%@", textfieldtext.text]; label.tag = 102; [label settextalignment:nstextalignmentcenter]; [self.view addsubview:label]; for (int i = 1; i<x; i++) { UITextField *hidefield = (UITextField*)[self.view viewwithtag: i] ; hidefield.hidden=yes; p=21; CGRect labelframe = CGRectMake( 20, 180, 189, 20 ); UITextField *textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = p; [self.view addsubview: textfield]; p=p+1; NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; NSMutableArray *array3 = [[NSMutableArray alloc] init]; [array3 addobject:[nsstring stringwithformat:@"%@", textfieldtext.text]]; [defaults setobject:array3 forkey:@"array3"]; [defaults synchronize]; _rightsidebarbutton = self.navigationitem.rightbarbuttonitem = [[UIBarButtonItem alloc] initwithtitle:@"done" style:uibarbuttonitems tylebordered target:self action:@selector(done:)]; for (int i = 201; i<221; i++) { UILabel *label = (UILabel*)[self.view viewwithtag: i]; label.hidden=yes; -(IBAction)create4:(id)sender;{ create1.hidden=yes; create2.hidden=yes; create3.hidden=yes; create4.hidden=yes; plus.hidden = YES; 38

save1.hidden=no; reset.hidden=yes; p=38; y=38; q=38; UILabel *label = [[UILabel alloc] initwithframe:cgrectmake(20, 90, 280, 30)]; UITextField *textfieldtext = (UITextField*)[self.view viewwithtag:4]; label.text = [NSString stringwithformat:@"\%@", textfieldtext.text]; label.tag = 103; [label settextalignment:nstextalignmentcenter]; [self.view addsubview:label]; for (int i = 1; i<x; i++) { UITextField *hidefield = (UITextField*)[self.view viewwithtag: i] ; hidefield.hidden=yes; for (int i = 201; i<221; i++) { UILabel *label = (UILabel*)[self.view viewwithtag: i]; label.hidden=yes; w=29; CGRect labelframe = CGRectMake( 20, 180, 189, 20 ); UITextField *textfield = [[UITextField alloc] initwithframe: labelframe]; textfield.borderstyle = UITextBorderStyleRoundedRect; textfield.text = @"Name exercise.."; textfield.textcolor = [UIColor lightgraycolor]; textfield.tag = w; [self.view addsubview: textfield]; w=w+1; NSUserDefaults *defaults = [NSUserDefaults standarduserdefaults]; NSMutableArray *array4 = [[NSMutableArray alloc] init]; [array4 addobject:[nsstring stringwithformat:@"\%@", textfieldtext.text]]; [defaults setobject:array4 forkey:@"array4"]; [defaults synchronize]; _rightsidebarbutton = self.navigationitem.rightbarbuttonitem = [[UIBarButtonItem alloc] initwithtitle:@"done" style:uibarbuttonitems tylebordered target:self action:@selector(done:)]; 39