• No results found

Utvecklande av träninsapp för iOS 7

N/A
N/A
Protected

Academic year: 2022

Share "Utvecklande av träninsapp för iOS 7"

Copied!
115
0
0

Loading.... (view fulltext now)

Full text

(1)

TVE 14 022 juni

Examensarbete 15 hp 13 Juni 2014

Utvecklande av träningsapp för iOS 7

Gustav Forslid

Håkan Wieslander

(2)

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

Abstract

Utvecklande av träningsapp för iOS 7 Developing of workout app for iOS 7

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.

Examinator: Martin Sjödin Ämnesgranskare: Daniel Carlsson Handledare: Christoffer Karlsson

(3)

Popul¨ arvetenskaplig sammanfattning

Anv¨andandet av smartphones har ¨okat drastiskt i v¨arlden och med det ¨aven anv¨andandet av appar. Genom att anv¨andaren sj¨alv kan v¨alja vilka appar denna

¨

ar intresserad av, kan telefonen skr¨addarsys utifr˚an anv¨andarens intressen. Sam- tidigt har under de senare ˚aren en tr¨aningstrend kommit och antalet svenskar som ¨ar medlemmar p˚a gym ¨okat. Dock ¨ar trenden den samma ¨overallt: efter ett tag som medlem slutar man att g˚a till gymmet. Kan man utnyttja det ¨okade app-anv¨andandet och skapa en app som hj¨alper gemene man att bibeh˚alla sin tr¨aning?

Projektet gick ut p˚a att unders¨oka vad som konstituerar en bra app, hur denna ¨ar utformad och vad som motiverar folk till tr¨aning. Med denna in- formation skulle sedan en tr¨aningsapp, som dels kan motivera samt fungera som bas i tr¨aningssammanhang, skapas. Informationen om hur den optimala tr¨aningsappen s˚ag ut samlades in genom en unders¨okning. H¨ar fick folk ty- cka till och ge exempel p˚a allt fr˚an utformande av appar till nya sp¨annande anv¨andningsomr˚aden f¨or appar inom tr¨aningssammanhang.

Appen utvecklades f¨or Apples mobiltelefoner, iPhone, med operativsystemet iOS 7. Den skrevs i kodspr˚aket Objective-C och p˚a programmeringsplattformen Xcode. Appens inneh˚all fokuserades p˚a att skapa en profilsida d¨ar anv¨andaren kan skapa sina pass, en statistiksida d¨ar anv¨andaren kan se statistik ¨over sin utveckling och en sida f¨or att fylla i och spara data fr˚an tr¨aning.

(4)

Inneh˚ all

1 Introduktion 6

1.1 Bakgrund . . . 6

1.1.1 Apple . . . 6

1.1.2 Applikationer . . . 6

1.1.3 Tr¨aning . . . 6

1.2 Projekt . . . 6

1.2.1 Fr˚agest¨allning . . . 6

1.2.2 Uppgift . . . 7

1.2.3 M˚als¨attning . . . 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¨aningsuppl¨agg . . . 8

3 Metoder 8 3.1 Inledande arbete och unders¨okning . . . 8

3.2 Meny . . . 9

3.3 Profilsidan . . . 10

3.4 Tr¨aningssidan . . . 11

3.5 Statistiksidan . . . 11

4 Resultat 12 4.1 Unders¨okning . . . 12

4.2 Appen . . . 14

4.2.1 Meny . . . 14

4.2.2 Profilsidan . . . 14

4.2.3 Tr¨aningssidan . . . 16

4.2.4 Statistiksidan . . . 18

5 Diskussion 19 5.1 Unders¨okningen . . . 19

5.2 Designen . . . 19

5.3 Anv¨andarv¨anlighet . . . 20

5.4 Sv˚arigheter . . . 20

5.5 Buggar . . . 20

6 Slutsats 20 6.1 M˚als¨attning . . . 20

6.2 Unders¨okningen . . . 21

6.3 Optimering . . . 21

6.4 Utvecklingsm¨ojligheter . . . 21

(5)

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¨aningssidan . . . 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

(6)

1 Introduktion

1.1 Bakgrund

1.1.1 Apple

Apple ¨ar en av de st¨orsta leverant¨orerna av mobiltelefoner i v¨arlden. Deras egna telefoner, Iphone, har blivit vida popul¨ara p˚a grund av deras anv¨andarv¨anlighet.

Apple har ett stort urval av applikationer (f¨orkortas appar) som anv¨andare kan ta del av. Till skillnad fr˚an Androidbaserade telefoner har Apple ett eget ap- putvecklingssystem. De androidbaserade telefonerna anv¨ander sig av google som app-butik (Google Play) medan Apple har sin egen app-butik kallad Appstore.

F¨or att distribuera appar till Appstore beh¨over utvecklare vara med i Apples iOS developer program.1 Detta ger f¨ordelen att apparna i AppStore ofta h˚aller h¨og standard. Apparna till Apples telefoner grundar sig p˚a kodspr˚aket Objective-C.

1.1.2 Applikationer

Sverige ¨ar ett av de l¨ander, i v¨arlden, d¨ar st¨orst andel av befolkningen innehar smartphones. Hela 78% av den svenska befolkningen hade en smartphone 2010.2 Begreppet smartphone inneb¨ar en mobiltelefon som b˚ade kan anv¨andas som handdator och f¨or vanlig mobiltelefoni. Det alla smartphones har gemensamt

¨

ar att de anv¨ander sig av appar. Genom att anv¨andaren sj¨alv f˚ar v¨alja vilka appar den ska ladda ner har anv¨andaren en stor m¨ojlighet att skr¨addarsy sin smartphone. Utbudet av appar har v¨axt exponentiellt de senaste ˚aren. 2012 meddelade Apple att deras utbud av appar i Appstore uppgick till 1 miljon appar.3

1.1.3 Tr¨aning

I dagens samh¨alle har vi tv˚a sorters tr¨aning: styrke- och motionstr¨aning. Man kan ¨aven dela in dessa b˚ada i ytterligare tv˚a fack: viktminskande och viktun- derh˚allande tr¨aning. Detta inneb¨ar att ordet tr¨aning har olika inneb¨ord f¨or olika m¨anniskor beroende av vad de har f¨or m˚al och intressen inom/med tr¨aningen.

F¨or varje ˚ar som g˚ar blir det mer och mer popul¨art f¨or oss svenskar att bli medlemmar i ett gym. 2007 var det 33% av den svenska befolkningen som var medlem p˚a ett gym eller liknande fitnesscenter.4

1.2 Projekt

1.2.1 Fr˚agest¨allning

I dagsl¨aget ¨ar det m˚anga i Sverige som har ett medlemskap p˚a gym. Trenden ¨ar dock den samma ¨overallt, efter ett tag som medlem slutar man g˚a till gymmet.

Kan man med hj¨alp av en app motivera folk att forts¨atta tr¨ana? Vad kr¨avs av appen f¨or att folk ska bli motiverade? Hur ¨ar en bra app uppbyggd?

(7)

1.2.2 Uppgift

Projekter g˚ar ut p˚a att unders¨oka hur en bra app ¨ar konstruerad och vad som, i en app, kan motivera folk att tr¨ana. Slutprodukten av projektet ska vara en app som kan fungera som motivation till tr¨aning och byggd efter de kriterier som definierar en bra app. Appen ska kunna f¨ora statistik ¨over anv¨andarens utveck- ling. En del fokus kommer att ligga i att anv¨andaren f˚ar bygga sin egen profil i appen. Denna kommer anv¨andas som underlag f¨or delar av statistikf¨orandet.

1.2.3 M˚als¨attning

Den fr¨amsta m˚als¨attningen med projektet ¨ar att f˚a en st¨orre kunskap om utveck- ling och programmering av appar. I slut¨anden ¨ar m˚alet att ha skapat en app som kan inspirera folk att dels b¨orja tr¨ana samt att bibeh˚alla motivationen att forts¨atta tr¨ana.

2 Teori

2.1 Apputveckling

2.1.1 iOS

iOS ¨ar ett operativsystem fr˚an Apple, skapat f¨or Apples mobila enheter. Oper- ativsystemet har ett multi-touch gr¨anssnitt, vilket inneb¨ar att anv¨andaren kan anv¨anda sig av olika handr¨orelser f¨or att anv¨anda funktioner i telefonen. Ex- empel p˚a detta ¨ar att dra ¨over sk¨armen (swipe) f¨or att navigera eller knipa p˚a sk¨armen (pinch) f¨or att zooma. iOS ¨ar byggt p˚a ett ramverk som kallas Co- coa Touch. Cocoa Touch g¨or det m¨ojligt f¨or apputvecklare att kunna anv¨anda exempelvis enhetens inbyggda accelerometer och de olika r¨orelsem¨onsterna p˚a sk¨armen.5Operativsystemet ¨ar inne p˚a sin sjunde utvecklarversion (iOS 7), och appar som utvecklas idag till iOS utvecklas med f¨ordel till den versionen. Appar till iOS ¨ar skrivna i kodspr˚aket Objective-C.

2.1.2 Xcode

F¨or att programmera appar till iOS beh¨over man programmet Xcode som Ap- ple erbjuder gratis fr˚an deras AppStore. Programmet ¨ar speciellt utformat f¨or att g¨ora det s˚a enkelt och ¨oversk˚adligt som m¨ojligt f¨or approgrammering. Pro- grammet fungerar p˚a s˚a s¨att att man har en storyboard d¨ar man kan f˚a en visuell ¨oversikt ¨over sin app. I storyboarden kan man designa sin app genom att v¨alja olika funktioner man vill ha, t.ex s˚a kan man l¨agga till knappar och andra funktioner till olika View controllers, som ¨ar ens sidor i appen. Det finns olika typer av View controllers som ¨ar specificerade att fungera f¨or olika saker.

Exempel p˚a detta ¨ar Table View som ¨ar en sida med en tabellfunktion. Det finns ocks˚a en Navigation Controller som g¨or det m¨ojligt att navigera mellan olika sidor i appen. Allt kopplas sedan samman i ens klasser- och metodkoder som man programmerar och l¨ankar till sina View Controllers.

(8)

2.1.3 Objective-C

Objective-C ¨ar ett objektorienterat programmeringsspr˚ak som prim¨art anv¨ands f¨or att skriva appar till iOS. Spr˚aket ¨ar en utveckling p˚a det vanliga C spr˚aket, d¨ar man har lagt till syntax f¨or att definiera klasser och metoder.6 Vanligtvis har man en k¨allkod eller en klassfil d¨ar variabler och metoder definieras ¨aven kallad en headerfil (.h-fil). Man beh¨over ocks˚a en metodfil (.m-fil) eller im- plementationsfil d¨ar man definierar vad metoderna ska g¨ora.7 Det som skiljer Objective-C fr˚an vanliga C ¨ar att man anv¨ander sig av syntax fr˚an ”smalltalk”, som ¨ar ett annan typ av objektorienterat programmeringsspr˚ak. Inom smalltalk spr˚aket anv¨ander man dig av meddelanden som man skickar till sina objekt. Till exempel om man ska skapa en str¨ang och ge den ett namn kan man skriva,

NSString *newString = [NSString stringWithFormat:@”Namn”];

d¨ar stringWithFormat ¨ar ett meddelande man skickar till sitt NSString objekt.

Man ger allts˚a string objektet namnet ”Namn”. En annan del av smalltalk ¨ar att alla variabler och objekt behandlas som objekt. Detta ger f¨ordelen att man kan skicka meddelanden till allt man har skapat, vare sig det ¨ar en instansvariabel eller ett objekt.8

2.2 Tr¨ aningsuppl¨ agg

Beroende p˚a hur man vill l¨agga upp sin tr¨aning p˚a gymmet s˚a delar man in kroppen i olika delar. Detta ger f¨ordelen att vissa muskelgrupper inte tr¨anas fler eller f¨arre g˚anger j¨amf¨ort med andra muskelgrupper. Vanligt ¨ar t.ex att man kombinerar triceps med axlar och br¨ost samt biceps med rygg. Anledningen till detta ¨ar att tr¨anar man t.ex rygg s˚a kommer ¨aven bicepsen att jobba osv.

Det ¨ar inte bara vilka muskelgrupper som man tr¨anar som styr strukturen p˚a ens gympass. Beroende p˚a hur man vill bygga sin kropp s˚a kan man ¨aven anpassa hur m˚anga repetitioner och upps¨attningar man k¨or. Repetitioner kallas reps och inneb¨ar hur m˚anga lyft man g¨or. Upps¨attningar kallas sets och inneb¨ar hur m˚anga omg˚angar man utf¨ort sina reps. Vill man bygga en stor och explosiv kropp brukar man ofta k¨ora f¨arre reps men fler sets. Det vanligaste som ¨aven de flesta gyminstrukt¨orer l¨ar ut f¨or en nyb¨orjare ¨ar d¨aremot att k¨ora fler reps t.ex 12 med 3 sets. Detta uppl¨agg ger mer uth˚alliga, men inte lika stora, muskler.

3 Metoder

3.1 Inledande arbete och unders¨ okning

Projektet inleddes med studier i Objective-c och anv¨andande av Xcode. Detta gjordes genom olika gratiskurser och guider p˚a internet. Efter att ha f˚att en in- blick i hur Objective-c fungerade inriktades studierna mer p˚a Xcode och kodning som ¨ar mer v¨asentlig mot apputveckling. Den st¨orsta delen av dessa studierna gick ut p˚a att programmera olika typer av enkla appar fr˚an diverse guider p˚a bland annat Youtube.

(9)

F¨or att kunna g¨ora en s˚a bra app som m¨ojligt genomf¨ordes en unders¨okning d¨ar ca. 40 personer fick svara p˚a diverse fr˚agor om appar och tr¨aning. Urvals- gruppen f¨or unders¨okningen var fr¨amst studenter i 20-30 ˚ars ˚aldern. Fr˚agorna var av typen, ”Hur ofta tr¨anar du p˚a gym”, ”Anv¨ander du n˚agon typ av tr¨aningsapp i dagsl¨aget”, ”Vilka funktioner ¨ar bra i appar du anv¨ander” och

”Vilken form av statistik skulle du vara intresserad av i en tr¨aningsapp”.

3.2 Meny

F¨or att f˚a en snygg meny anv¨andes en s˚a kallad ”Slide out menu”, allts˚a en meny som kommer fram fr˚an sidan av telefonen d˚a anv¨andaren antingen drar ut den med fingret p˚a sk¨armen eller trycker p˚a ”Meny”-knappen. F¨or att f˚a till en s˚adan meny beh¨over man anv¨anda sig av ett externt bibliotek, i detta fallet anv¨andes ett bibliotek som heter SWReveal.9SWReveal kommer med en .h-fil och en .m-fil med metoder som kan anv¨andas och implementeras till ens egna filer. D¨ar finns till exempel metoder som anv¨ands f¨or att s¨aga till telefonen att, n¨ar en knapptryckning eller ett r¨orelsem¨onster inleds ska menyn komma fram. F¨orst kopierades SWreveal filerna in i projektet f¨or att kunna anv¨anda dess funktioner. D¨arefter skapades en Navigation Controller som har hand om hur navigationen mellan appens sidor ¨ar kopplade och en Table View f¨or att f˚a en snygg meny i tabellform. Navigation Controllern och Table Viewn kopplades med ett ”reveal view controller”-kommando s˚a att dessa visas n¨ar en knapp- tryckning eller gest sker. F¨or Navigation Controllern sattes identifikationen till

”front” och f¨or table view till ”rear”. Detta ger att table view hamnar inuti Navigation Controllern och blir d¨arf¨or utseendet p˚a menyn. F¨or att konstruera menyn anv¨andes tre stycken View Controllers, en f¨or profilsidan, en f¨or statis- tiksidan och en som ¨ar startsida och sida d¨ar anv¨andaren kan starta sin tr¨aning.

F¨or 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˚a vilken label man tryckte p˚a skulle anv¨andaren 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˚a toppen av sk¨armen, d¨ar menyknappen placer- ades. F¨or varje view controller som skapades implementerades en kod f¨or att, vid knapptryckning p˚a menyknappen, ska menyn komma fram;

sidebarButton.target = self.revealViewController;

sidebarButton.action = @selector(revealToggle:);

d¨ar siderbarButton ¨ar namnen p˚a menyknappen. Den ¨oversta kodbiten beskriver vilket m˚al som knapptryckningen kommer medf¨ora, allts˚a att Naviga- tion Controllern kommer anropas. Den undre kodbiten beskriver vilken metod som tillkallas vid knapptryckningen. Metoden som anv¨ands kallas revealToggle och ¨ar en av metoderna som kommer med SWReveal biblioteket. Metoden ger en snygg animerad utdragning av sidomenyn.

(10)

3.3 Profilsidan

Profilsidan ¨ar grundstenen i appen. H¨ar skapar anv¨andaren de olika passen och passens tillh¨orande ¨ovningar. Utan dessa g˚ar resterande funktioner ej att anv¨anda.

Till en b¨orjan skapades fyra stycken textfields, i dessa kan anv¨andaren skriva in namnen p˚a de olika pass de vill ha. Till varje textfield lades det till en knapp med namnet create. F¨or varje knapp skrevs det en metod som skapar en NSmutableArray. NSmutableArray ¨ar en array d¨ar man inte beh¨over specificera hur m˚anga objekt som ska ligga i denna. F¨or att g¨ora det s˚a enkelt som m¨ojligt lades passnamnet in p˚a f¨orsta platsen i respektive array. D¨arefter sparades arrayen och dess inneh˚all med hj¨alp av NSUserDefaults. Fast¨an man st¨anger av appen helt sparar NSUserDefaults informationen man lagrat. Simultant som det skapades en NSMutableArray hoppar appen in i en ny sida. P˚a denna sida skapades 8 nya textfields. I dessa skriver anv¨andaren in namnen p˚a de ¨ovningar denna vill l¨agga till i sitt pass. ¨Aven h¨ar har varje textfield varsin knapp med en metod som sparar de ¨ovningar som har skrivits in. I detta fall har knapparna d¨opts till save. F¨or dessa knappar skapas det nya NSMutableArray f¨or varje g˚ang anv¨andaren trycker p˚a knappen. Namnet p˚a ¨ovningen hamnar p˚a f¨orsta plats i listan, och dessa arrayer lades till i den f¨orsta array som skapades till det passet anv¨andaren l¨agger till ¨ovningar i. Anledning att namnet p˚a passen och p˚a ¨ovningar l¨aggs till p˚a f¨orsta platsen i respektive array ¨ar f¨or att man enkelt, i de andra sidorna, ska kunna veta vad anv¨andaren d¨opt allt till. F¨or att inte anv¨andaren ska kunna av misstag ¨andra passnamn och ¨ovningsnamn s˚a sker ytterligare en process vid tryck av create och save knapparna. De textfields d¨ar namnen skrivits in g¨ors om till labels med samma text som det d¨opta passet, vilket inneb¨ar att de inte l¨angre g˚ar att ¨andra namn p˚a passet.

Har anv¨andaren skapat 4 olika pass samt 8 ¨ovningar i respektive pass blir detta allts˚a 32 stycken olika labels samt 12 stycken olika knappar. F¨or att f¨orenkla kontrollen av dessa s˚a anv¨andes ett system f¨or att taga allt. Att ett objekt f˚ar en tag inneb¨ar egentligen att den f˚ar ett id-nummer. Dessa id- nummer anv¨andes sedan f¨or att kunna identifiera vad som skapats. F¨orsta g˚angen anv¨andaren kommer in p˚a profilsidan finns enbart ett textfield och en create knapp. Allts˚a har resterande textfields och knappar tagits bort med hj¨alp av if-satser och for-loopar som kontrollerar objektens id-nummer och tar bort det ¨overfl¨odiga.

P˚a grund av att anv¨andaren ska f˚a best¨amma hur m˚anga pass denna vill ha och f¨or att appen tar bort ¨overfl¨odiga knappar, lades det till tv˚a extra knappar.

Dessa knappar fick b˚ada symbolen av ett plustecken, b˚ada kopplades ihop s˚a att tryck p˚a dessa genererar ett nytt textfield och en ny knapp. Det f¨orsta plustecknet reglerar m¨ojligheten f¨or anv¨andaren att skapa nytt pass och det andra reglerar att l¨agga till ytterligare ¨ovningar inuti passen.

Sist skapades en knapp med namnet reset, denna fick en metod som innebar att anv¨andaren nollst¨allde alla arrayer som skapats. Efter att ha tryckt p˚a denna ˚atg˚ar allts˚a profilsidan till den ursprungliga formen och ger anv¨andaren m¨ojlighet att skapa nya pass med nya ¨ovningar.

(11)

3.4 Tr¨ aningssidan

Tr¨aningssidan ¨ar den f¨orsta sidan anv¨andaren m¨oter n¨ar appen startas. P˚a tr¨aningssidan ska anv¨andaren kunna registrera hur m˚anga sets, reps och vilken vikt denna har anv¨ant. Det f¨orsta som skapades var en stor knapp i mitten av sk¨armen med texten ”New workout”, klickar anv¨andaren p˚a denna ska denna kunna se sina skapade pass. ”New workout”-knappen kopplades till en metod som h¨amtar de sparade arrayerna och g˚ar igenom vilka som har n˚agot inneh˚all.

F¨or att h¨amta den sparade informationen fr˚an appens minne anv¨andes ”stan- dardUserDefaults”.10

Fyra knappar och en label lades till och antalet knappar som var synliga efter att anv¨andaren klickat p˚a ”New workout” best¨amdes med hj¨alp av hur m˚anga arrayer som hade n˚agot inneh˚all. Knapparna d¨optes till namnen som l˚ag sparade i arrayerna och kopplades till fyra olika metoder. Det f¨orsta i de fyra metoderna var att s¨atta en text p˚a labeln, denna text var namnet p˚a passet.

Efter detta skapades en label med namnet p˚a ¨ovningen och tre textfields d¨ar anv¨andaren kan fylla i sets, reps och tyngd. Detta gjordes med en ”for”-sats som gick igenom arrayen f¨or passet och skapade s˚a m˚anga labels och textfields som det fanns ¨ovningar i sparade.

F¨or att spara v¨ardena i textfieldsen skapades en save knapp. Save knappen multiplicerade ihop v¨ardena i de olika textfieldsen f¨or de respektive ¨ovningarna och sparade produkten i arrayen f¨or ¨ovningen. Denna arrayen sparades sedan

¨

over i arrayen f¨or passet och allt sparades sedan i appens minne.

3.5 Statistiksidan

F¨or att kunna rita grafer i appen anv¨andes ett externt bibliotek som heter

”Core Plot”.11 F¨or att implementera Core Plot i Xcode beh¨over man l¨agga till en mapp med ett antal .h-fil med definitioner som anv¨ands f¨or animationer och grafiskt utnyttjande av sk¨armen. Core Plot anv¨ander sig av ett ramverk som Apple tillhandah˚aller som heter Quartz Core som g¨or det m¨ojligt med bildbearbetning.12 Quartz Core l¨ankades in s˚a att det kunde anv¨andas till alla bibliotek.

Efter att Core Plot var implementerat i projektfilen b¨orjade den grafiska utvecklingen av statistiksidan. F¨or att anv¨andaren skulle f˚a en s˚a enkel och snygg ¨oversikt som m¨ojligt best¨amdes det att anv¨andaren f¨orst ska komma till en sida med knappar som ¨ar d¨opta efter anv¨andarens pass. De olika arrayerna d¨ar anv¨andaren sparat sina pass h¨amtades fr˚an minnet och fyra knappar skapades.

De fyra knapparnas text ¨andrades med hj¨alp av namnen p˚a anv¨andarens pass.

Detta gjordes med hj¨alp av ”if”-satser som kollar om de h¨amtade arrayerna ¨ar tomma, var n˚agon array tom s˚a g¨omdes de knapparna. Anv¨andaren f˚ar allts˚a bara upp s˚a m˚anga knappar som den har skapat pass. N¨ar anv¨andaren sedan klickar p˚a en knapp ska det komma upp ett nytt antal knappar med anv¨andarens

¨

ovningar. 8 knappar skapades och d¨optes p˚a samma s¨att med hj¨alp av de olika arrayerna.

N¨asta steg var att f˚a fram en graf ¨over v¨ardena anv¨andaren lagt i arrayerna.

(12)

F¨or detta skapades f¨orst en metod som kallades ”graph”. Denna metoden skulle tillkallas f¨or att rita en graf med anv¨andarens v¨arden p˚a sk¨armen. Det f¨orsta i metoden var att l¨agga en View p˚a sk¨armen som kan hantera en graf. Sedan skapades en tom graf som lades till p˚a sk¨armen. F¨or att kunna best¨amma x- och y-koordinaternas r¨ackvidd skapades ett utrymme f¨or hur mycket plats den faktiska grafen f˚ar anv¨anda av Viewen. X-koordinatens r¨ackvidd sattes till l¨angden p˚a den arrayen man ville plotta plus 1 s˚a att grafen inte slutade i kanten av sk¨armen. Y-koordinatens r¨ackvidd sattes till det maximala v¨ardet i arrayen plus det maximala v¨ardet delat p˚a 10. Detta f¨or att f˚a en snygg y-axel som t¨acker in hela grafen plus lite till. F¨or att ha n˚agra v¨arden att plotta p˚a grafen skapades en metod som tar ut data till plotten. I denna metoden f¨ordes alla v¨arden ¨over fr˚an arrayen med ¨ovningen som anv¨andaren var intresserad av och

¨

over till en ny array. I den nya arrayen hade namnet p˚a ¨ovningen tagits bort, denna array inneh¨oll bara data.

Core Plot anv¨ander sig av tv˚a metoder f¨or att plotta datan, en som r¨aknar ut hur m˚anga v¨arden som ska plottas och en som tar fram datan f¨or x- och y-koordinaten. Dessa metoder tillkallas automatiskt n¨ar graph-metoden k¨ors.

I den f¨orsta metoden gjordes en r¨akning av hur m˚anga v¨arden 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¨ okning

Resultatet av unders¨okningen gav f¨oljande svar:

(a) Ar du i dagsl¨¨ aget medlem i ett gym?

(b) Om du ¨ar medlem i ett gym i dagsl¨aget hur ofta g˚ar du dit i veckan?

(c) Anv¨ander du i dagsl¨aget n˚agon tr¨aningsapp?

Figur 1: Statistiska fr˚agor fr˚an unders¨okningen

Om du anv¨ander en tr¨aningsapp i dagsl¨aget vilka funktioner uppskattar du i dessa?

(13)

I princip alla svarade att den funktion som var mest uppskattad var n˚agon form av statistikf¨orande funktion. M˚anga ville ¨aven ha push-up notiser som p˚aminner dem att g˚a att tr¨ana, kalorir¨aknare samt tips p˚a olika ¨ovningar.

Vilken form av statistik skulle du vara intresserad av att kunna f˚a fram i en tr¨aningsapp?

P˚a denna fr˚aga var det fokus p˚a tv˚a olika saker. En del fokuserade p˚a sin vikt och ville d˚a kunna se sin kroppsvikt i en graf samt kunna skriva in deras kaloriintag och r¨akna ut hur mycket kalorier de br¨anner. Den andra halvan hade fokus p˚a den personliga utvecklingen. De ¨onskade grafer f¨or hur deras styrka i olika ¨ovningar har utvecklats, ¨aven en funktion som ber¨aknade deras tr¨aningsfrekvens.

Vilka funktioner skulle du bli motiverad att tr¨ana i en app?

Aven h¨¨ ar var de svarande enade om att statistik var de absolut b¨asta s¨attet att bli motiverad. M˚anga trodde ¨aven p˚a tr¨aningsplanering d¨ar tr¨aningen schemalades veckovis. Som motivation kunde man anv¨anda sig av p˚aminnande push-up notiser som skickades till anv¨andaren. Ett f˚atal var intresserade i att appen skulle erbjuda tips p˚a olika ¨ovningar.

Hur ¨ar en bra app utformad rent anv¨andarm¨assigt?

De svarande var eniga, de vill ha appar som ¨ar l¨attman¨ovrerade och enkla att anv¨anda. G¨arna stora knappar och inte f¨or m˚anga komplicerade funktioner.

N˚agra la ¨aven fokus p˚a att designen skulle vara trevlig och h¨ora ihop med op- erativsystemet.

Finns det n˚agot mer som du skulle villja att din tr¨aningsapp inneh¨oll?

Denna fr˚aga gav folk fritt t¨ankade och svaren var v¨aldigt varierande.

• Tr¨aningsdagbok

• Stretching-tips

• Tips p˚a hur man kan utveckla sig sj¨alv

• Anv¨anda den f¨or l¨opning

• Samla po¨ang och t¨avla mot v¨anner

• F¨ardiga exempel p˚a olika pass att dela upp kroppen i

• F¨orslag p˚a n¨aringsrik mat, recept

• Personligt schema

(14)

4.2 Appen

4.2.1 Meny

Det fr¨amsta resultatet av att skapa en anv¨andarv¨anlig app blev en ”slide out menu” som g˚ar att n˚a fr˚an alla sidor i appen (Figur 2).

(a) Meny indragen (b) Meny utdragen

Figur 2: J¨amf¨orelse av startsidan i appen

4.2.2 Profilsidan

F¨orsta g˚angen anv¨andaren kommer in p˚a profilsidan f˚ar denna skapa sina pass (Figur 3).

Figur 3: Profilsidan d˚a inga pass ¨ar skapade

Efter att anv¨andaren skrivit in namnet p˚a sitt pass flyttas denna vidare till en sida d¨ar anv¨andaren kan fylla i namnen p˚a sina ¨ovningar (Figur 4).

(15)

(a) Inga ¨ovningar tillagda till passet

(b) Tv˚a ¨ovningar tillagda till passet och m¨ojlighet att l¨agga till fler

(c) Skapande av en tredje

¨ ovning

Figur 4: Efter att ett pass ¨ar skapat l¨aggs ¨ovningar till i passet

Efter att anv¨andaren skapat s˚a m˚anga ¨ovningar som beh¨ovs trycker denna p˚a spara och kommer d˚a tillbaka till sidan f¨or att skapa flera pass (Figur 5).

(a) Ett pass skapat med m¨ojlighet att l¨agga till ett till

(b) Fyra pass skapade och profilen ¨ar full, m¨ojlighet att rensa allt

Figur 5: Profilsidan med skapade pass

(16)

4.2.3 Tr¨aningssidan

Tr¨aningssidan ¨ar den f¨orsta sidan anv¨andaren m¨oter n¨ar appen startas, den g˚ar

¨

aven att n˚a fr˚an menyn (Figur 6).

Figur 6: Tr¨aningssidans f¨orsta vy

Efter att tryckt p˚a ”New Workout” kommer anv¨andaren till en sida f¨or att v¨alja pass (Figur 7).

Figur 7: Val av pass att tr¨ana

(17)

N¨ar passet ¨ar valt kan anv¨andaren b¨orja fylla i antal sets, reps och vikt denna har tr¨anat med (Figur 8).

(a) H¨ar kan anv¨andaren fylla i vad denna tr¨anat

(b) Beskrivning av hur anv¨andaren fyller i v¨arden p˚a ¨ovningarna

Figur 8: Sida f¨or att fylla i under tr¨aningen

Efter ett avslutat pass klickar anv¨andaren p˚a ”save” och tr¨aningen ¨ar slut (Figur 9).

Figur 9: Avslutad tr¨aning

(18)

4.2.4 Statistiksidan

P˚a statistiksidan ser anv¨andaren hur tr¨aningen utvecklas. Det f¨orsta anv¨andaren m¨ots av ¨ar m¨ojligheten att v¨alja vilket pass denna vill se statistik ¨over (Figur 10).

Figur 10: F¨orsta sidan d¨ar anv¨andaren v¨aljer vilket pass denna vill se statistik

¨ over

Efter val av pass f˚ar anv¨andaren v¨alja vilken ¨ovning som denna vill se statis- tik ¨over (Figur 11).

Figur 11: Val av ¨ovning anv¨andaren vill se statistik ¨over

(19)

Slutgiltligen f˚ar anv¨andaren se en kurva ¨over hur utvecklingen p˚a vald ¨ovning ser ut (Figur 12).

Figur 12: Kurva ¨over tr¨aningsutvecklingen f¨or en vald ¨ovning

5 Diskussion

5.1 Unders¨ okningen

Av de 42 personerna som svarade p˚a unders¨okningen var det hela 31 personer som var medlemmar p˚a ett gym. Detta speglar tyv¨arr inte verkligheten d˚a det i Sverige enbart ¨ar 33% av befolkningen som ¨ar medlem p˚a gym. Urvalsgruppen var studenter i 20-30 ˚ars ˚aldern, vilket f¨ormodligen ¨ar en samh¨allsgrupp som tr¨anar mer ¨an andra. Detta ¨ar inte enbart negativt utan positivt i den aspekten att de som svarade redan hade stor vetskap om tr¨aning p˚a gym. Det negativa blir att den m˚algrupp som s¨oktes som inte tr¨anade p˚a gym men ville bli motiverade av appen inte fick s¨aga sitt. Bortsett fr˚an om de inte tr¨anade eller tr¨anade s˚a var resultatet bra. De svarande beskrev tydligt och klart vad de gillade och inte gillade i b˚ade vanliga appar och tr¨aningsappar.

5.2 Designen

Designen av appen blev v¨aldigt enkel. P˚a de flesta sidorna har anv¨andaren enbart ett f˚atal knappar att trycka p˚a vilket g¨or helheten v¨aldigt enkel p˚a ap- pen. Valet av f¨argkombinationer gjordes s˚a att de skulle passa bra med Apples egna gr¨anssnitt. Designen av menyn finns i flera andra appar vilket g¨or att anv¨andaren l¨att kan f¨orst˚a hur allt funkar. Knapparna gjordes tydliga, med bra kontrast mot bakgrunden, f¨or att allt skulle bli s˚a tydligt som m¨ojligt.

(20)

5.3 Anv¨ andarv¨ anlighet

Anv¨andarv¨anligheten ˚aterfinns fr¨amst i den meny som skapades. F¨or att f˚a funktionerna inuti appen att bli s˚a anv¨andarv¨anliga som m¨ojligt anv¨andes s˚a f˚a knappar som m¨ojligt. Detta gjorde att navigationen mellan sidorna blev v¨aldigt enkel. Tanken var att anv¨andaren alltid bara skulle vara ett knapptryck ifr˚an n¨asta steg.

5.4 Sv˚ arigheter

Den fr¨amsta sv˚arigheten med projektet var att anv¨anda sig av Objective-C och Xcode. Eftersom det inte fanns n˚agon vana av dessa tv˚a innan projektets start beh¨ovdes mestadels av tiden l¨aggas p˚a att l¨ara sig dessa. N¨ar projektet startade hade Apple nyligen sl¨appt en ny version av sitt operativsystem, iOS och m˚anga kommandon i Xcode hade uppdaterats. Detta gav sv˚arigheter att finna l¨osningar till de problem som uppstod d˚a de flesta l¨osningarna var till

¨

aldre versioner av Xcode och iOS.

Ett problem i sj¨alva utvecklingsstadiet var att anv¨anda ”taggar” till textfields och labels. Problemet var att om tv˚a objekt fick samma ”tag” blev den ena utan, vilket skapade problem att g¨omma dessa. Ett annat problem var anv¨andningen av Core Plot. De beskrivningarna som fanns f¨or detta bibliotek var v¨aldigt komplicerade och det tog l˚ang tid att tolka hur det skulle anv¨andas.

5.5 Buggar

I nul¨aget inneh˚aller appen tv˚a buggar. Den f¨orsta buggen intr¨affar i det fallet anv¨andaren skulle d¨opa alla sina pass till exakt samma sak. D˚a kommer ap- pen l¨agga in alla ¨ovningar f¨or alla pass med samma namn i det f¨orsta skapade passet. Den andra buggen intr¨affar d˚a anv¨andaren skapar ett pass utan att l¨agga till n˚agra ¨ovningar. Trycker sedan anv¨andaren p˚a ”New workout” och in p˚a det tomma passet kommer appen att crasha. B˚ada dessa buggar kom- mer f¨ormodligen aldrig anv¨andaren st¨ota p˚a, d˚a sannolikheten ¨ar l˚ag att appen anv¨ands p˚a detta s¨att.

Det ¨ar p˚a grund av tidsbrist som dessa buggar ej ¨ar ˚atg¨ardade. Vid officiellt sl¨app av appen skulle dessa beh¨ova ˚atg¨ardas. Eventuellt kan appen inneh˚alla andra buggar som ej uppt¨ackts.

6 Slutsats

6.1 M˚ als¨ attning

M˚als¨attningen f¨or projektet var att f˚a en st¨orre kunskap om utveckling och pro- grammering av appar. Med hj¨alp av en unders¨okning har kunskapen om hur en bra app ¨ar utvecklad ¨okat. Detta kan anv¨andas som bas i vidare projekt. N¨ar projektet startade fanns inga f¨orkunskaper om Objective-C och Xcode. Under projektets g˚ang har dessa ¨okat drastiskt och resulterat i en fungerande app med

(21)

m¨ojligheter f¨or statistikf¨orande, profilskapande och datasparande. Eftersom ap- pen ej ¨ar publicerad f¨or allm¨anheten ¨ar det sv˚art att s¨aga om m˚alet att skapa en motiverande app ¨ar uppfyllt. Det som g˚ar att s¨aga ¨ar att appen som skapas

¨

ar enkel och l¨attman¨ovrerad och har en m¨ojlighet att f¨ora statistik ¨over tr¨aning.

Dessa tv˚a egenskaperna var en stor del av vad unders¨okningen gav f¨or resultat.

6.2 Unders¨ okningen

Det fr¨amsta resultatet vid sammanst¨allningen av fr˚agorna i unders¨okningen, i m˚an om vad folk gillar i appar, ¨ar anv¨andarv¨anlighet. De svarande var enty- diga med att komplicerade funktioner och on¨odiga moment enbart gjorde dem mindre intresserade av att anv¨anda appen. Det beskrevs ocks˚a tydligt att de- signen och f¨argvalet skulle vara trevligt och vissa tyckte ¨aven att det skulle f¨olja operativsystemets design. I den andra delen av unders¨okningen fr˚agades det om olika funktioner i en tr¨aningsapp som kunde hj¨alpa anv¨andaren att mo- tiveras. H¨ar var det olika former av statistik som var mest eftertraktat s˚a som tr¨aningsfrekvens, viktkurva och styrkekurva. M˚anga gillade ¨aven id´een att ap- pen skickade ut s.k push notiser till anv¨andaren som p˚aminde denna om att tr¨ana.

6.3 Optimering

Det finns stora optimeringsm¨ojligheter i programkoden. F¨or optimering av ko- den kr¨avs dock ett stort arbete och mer kunskap, vilket p˚a grund av tidsbrist ej har hunnits med. Vid en eventuell lansering av appen hade vissa delar av koden beh¨ovt f¨orenklas eftersom appen drar on¨odigt mycket minne som det ser ut nu.

6.4 Utvecklingsm¨ ojligheter

F¨or att utveckla appen ytterligare, utifr˚an vad unders¨okningen gav, skulle dels vara att l¨agga in en funktion som g¨or det m¨ojligt f¨or anv¨andaren att planera sin tr¨aning samt l¨agga till funktionen push-up notiser som kan p˚aminna anv¨andaren om att tr¨ana.

Man hade kunnat skapa ett po¨angsystem f¨or anv¨andaren beroende p˚a hur dess tr¨aningsutveckling har g˚att samt om anv¨andaren f¨oljer sin tr¨aningsplanering.

Detta po¨angsystem hade man sedan kunnat f¨olja online d¨ar anv¨andaren t¨avlade mot andra anv¨andare.

En tredje nisch hade kunnat vara att fokusera p˚a kost och kalorier. D¨ar hade appen kunnat ha en kalorier¨aknare som dels r¨aknade ut hur mycket kalorier anv¨andaren stoppar i sig och hur mycket den f¨orbr¨anner. ¨Aven att appen kunnat tipsa om nyttiga och nyt¨ankande matr¨atter.

(22)

Referenser

[1] Apple, “Distribute.” https://developer.apple.com/programs/ios/distribute .html , 2014. (H¨amtad 23 maj, 2014).

[2] www.teknologin.se, “Svenskar anv¨ander smartphones mest.”

http://www.teknologin.se/index.php/artiklar/svenskar-anvander- smartphones-mest/ , 2013. (H¨amtad 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¨amtad 23 maj, 2014).

[4] SCB, “Personer 16-84 ˚ar som p˚a fritiden ¨agnat sig ˚at tr¨anat p˚a gym, tr¨aningscenter, fitnesscen- ter under de senaste 12 m˚anaderna 2006-2007.”

http://webcache.googleusercontent.com/search?q=cache:2AtMS7xFQ9YJ:

www.scb.se/Statistik/LE/LE0101/ documents/Tabell , 2007. (H¨amtad 28 April, 2014).

[5] Apple, “cocoa touch frameworks.” https://developer.apple.com/technologies /ios/cocoa-touch.html , 2014. (H¨amtad 21 April, 2014).

[6] Apple, “About Objective-C.” https://developer.apple.com/library/mac/

documentation/cocoa/conceptual/ProgrammingWithObjectiveC/Introduction /Introduction.html , 2014. (H¨amtad 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¨amtad 21 April, 2014).

[8] Wikipedia, “Smalltalk.” http://en.wikipedia.org/wiki/Smalltalk , 2014.

(H¨amtad 21 April, 2014).

[9] John-Lluch, “John-Lluch/SWRevealViewController.”

https://github.com/John-Lluch/SWRevealViewController , 2014. (H¨amtad 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¨amtad 22 maj, 2014).

[11] core plot, “core-plot/core-plot.” https://github.com/core-plot/core-plot , 2014. (H¨amtad 22 maj, 2014).

(23)

[12] Apple, “Quartz Core Framework Reference.”

https://developer.apple.com/library/mac/documentation/graphicsimaging /reference/QuartzCoreRefCollection/ index.html , 2014. (H¨amtad 22 maj, 2014).

(24)

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];

(25)

}

- (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

(26)

*)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;

(27)

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];

(28)

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;

break;

case 3:

create1.hidden=YES;

create2.hidden=YES;

create3.hidden=NO;

create4.hidden=YES;

break;

case 4:

create1.hidden=YES;

create2.hidden=YES;

create3.hidden=YES;

create4.hidden=NO;

break;

default:

break;

}

}

plus.hidden=YES;

x = x+1;

}

-(IBAction)plus2:(id)sender;{

if (y<13) {

(29)

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;

break;

case 7:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=NO;

break;

case 8:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=NO;

break;

case 9:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=NO;

break;

case 10:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=NO;

break;

case 11:

save1.hidden=YES;

save2.hidden=YES;

(30)

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=YES;

save7.hidden=NO;

break;

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;

break;

default:

break;

}

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;

break;

case 15:

save1.hidden=YES;

(31)

save2.hidden=YES;

save3.hidden=NO;

break;

case 16:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=NO;

break;

case 17:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=NO;

break;

case 18:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=NO;

break;

case 19:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=YES;

save7.hidden=NO;

break;

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;

break;

default:

break;

(32)

}

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;

break;

case 23:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=NO;

break;

case 24:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=NO;

break;

case 25:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=NO;

break;

case 26:

save1.hidden=YES;

save2.hidden=YES;

(33)

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=NO;

break;

case 27:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=YES;

save7.hidden=NO;

break;

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;

break;

default:

break;

}

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];

(34)

switch (w) { case 30:

save1.hidden=YES;

save2.hidden=NO;

break;

case 31:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=NO;

break;

case 32:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=NO;

break;

case 33:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=NO;

break;

case 34:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=NO;

break;

case 35:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=YES;

save7.hidden=NO;

break;

case 36:

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

(35)

save6.hidden=YES;

save7.hidden=YES;

save8.hidden=NO;

break;

default:

break;

}

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:

(36)

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];

(37)

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,

(38)

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;

(39)

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:)];

}

(40)

-(IBAction)save:(id)sender;{

plus2.hidden=NO;

UITextField *textFieldText;

if (y<38) {

textFieldText= (UITextField*)[self.view viewWithTag:y-1];

}

if (q<38) {

textFieldText= (UITextField*)[self.view viewWithTag:q-1];

}

if (p<38) {

textFieldText= (UITextField*)[self.view viewWithTag:p-1];

}

if (w<38) {

textFieldText= (UITextField*)[self.view viewWithTag:w-1];

}

NSMutableArray *array = [[NSMutableArray alloc] init];

[array addObject:[NSString stringWithFormat:@"\%@",textFieldText .text]];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSMutableArray *array1 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array1"]];

NSMutableArray *array2 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array2"]];

NSMutableArray *array3 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array3"]];

NSMutableArray *array4 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array4"]];

UILabel *label;

switch (x) { case 2:

label = (UILabel*)[self.view viewWithTag:100];

break;

case 3:

label = (UILabel*)[self.view viewWithTag:101];

break;

case 4:

label = (UILabel*)[self.view viewWithTag:102];

break;

case 5:

label = (UILabel*)[self.view viewWithTag:103];

(41)

break;

default:

break;

}

NSString *labelName = label.text;

NSString *first1;

NSString *first2;

NSString *first3;

NSString *first4;

if ((![array1 count] ==0)) {

first1 = [NSString stringWithFormat:@"\%@", [array1 objectAtIndex :0]];

} else{

first1 = [NSString stringWithFormat:@" "];

}

if ((![array2 count] ==0)) {

first2 = [NSString stringWithFormat:@"\%@", [array2 objectAtIndex :0]];

} else{

first2 = [NSString stringWithFormat:@" "];

}

if ((![array3 count] ==0)) {

first3 = [NSString stringWithFormat:@"\%@", [array3 objectAtIndex :0]];

} else{

first3 = [NSString stringWithFormat:@" "];

}

if ((![array4 count] ==0)) {

first4 = [NSString stringWithFormat:@"\%@", [array4 objectAtIndex :0]];

} else{

first4 = [NSString stringWithFormat:@" "];

}

if ([first1 isEqualToString:labelName]) { [array1 addObject:array];

(42)

[defaults setObject:array1 forKey:@"array1"];

[defaults synchronize];

}

if ([first2 isEqualToString:labelName]) { [array2 addObject:array];

[defaults setObject:array2 forKey:@"array2"];

[defaults synchronize];

}

if ([first3 isEqualToString:labelName]) { [array3 addObject:array];

[defaults setObject:array3 forKey:@"array3"];

[defaults synchronize];

}

if ([first4 isEqualToString:labelName]) { [array4 addObject:array];

[defaults setObject:array4 forKey:@"array4"];

[defaults synchronize];

}

switch (y) { case 6:

save1.hidden=YES;

break;

case 7:

save2.hidden=YES;

break;

case 8:

save3.hidden=YES;

break;

case 9:

save4.hidden=YES;

break;

case 10:

save5.hidden=YES;

break;

case 11:

save6.hidden=YES;

break;

case 12:

save7.hidden=YES;

break;

case 13:

(43)

save8.hidden=YES;

plus2.hidden=YES;

break;

default:

break;

}

switch (q) { case 14:

save1.hidden=YES;

break;

case 15:

save2.hidden=YES;

break;

case 16:

save3.hidden=YES;

break;

case 17:

save4.hidden=YES;

break;

case 18:

save5.hidden=YES;

break;

case 19:

save6.hidden=YES;

break;

case 20:

save7.hidden=YES;

break;

case 21:

save8.hidden=YES;

plus2.hidden=YES;

break;

default:

break;

}

switch (p) { case 22:

save1.hidden=YES;

break;

case 23:

save2.hidden=YES;

break;

(44)

case 24:

save3.hidden=YES;

break;

case 25:

save4.hidden=YES;

break;

case 26:

save5.hidden=YES;

break;

case 27:

save6.hidden=YES;

break;

case 28:

save7.hidden=YES;

break;

case 29:

save8.hidden=YES;

plus2.hidden=YES;

break;

default:

break;

}

switch (w) { case 30:

save1.hidden=YES;

break;

case 31:

save2.hidden=YES;

break;

case 32:

save3.hidden=YES;

break;

case 33:

save4.hidden=YES;

break;

case 34:

save5.hidden=YES;

break;

case 35:

save6.hidden=YES;

break;

case 36:

save7.hidden=YES;

break;

(45)

case 37:

save8.hidden=YES;

plus2.hidden=YES;

break;

default:

break;

} }

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBund leOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

// Custom initialization }

return self;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

for (int i = 1; i<y; i++) {

[(UITextField*)[self.view viewWithTag:i] resignFirstResponder];

}

}

-(void)done:(UIBarButtonItem*)rightSidebarButton;{

self.navigationItem.rightBarButtonItem = nil;

for (int i = 5; i<37; i++) {

UITextField *hideField = (UITextField*)[self.view viewWithTag: i]

;

hideField.hidden=YES;

}

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=YES;

save7.hidden=YES;

(46)

save8.hidden=YES;

plus2.hidden=YES;

plus.hidden=NO;

reset.hidden=NO;

for (int i=100; i<104; i++) {

UILabel *oldLabel = (UILabel *)[self.view viewWithTag:i];

oldLabel.hidden=YES;

}

NSMutableArray *array1 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array1"]];

NSMutableArray *array2 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array2"]];

NSMutableArray *array3 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array3"]];

NSMutableArray *array4 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array4"]];

CGRect labelFrame1;

CGRect labelFrame2;

CGRect labelFrame3;

CGRect labelFrame4;

UILabel *label1;

UILabel *label2;

UILabel *label3;

UILabel *label4;

switch (z) { case 1:

labelFrame1 = CGRectMake( 20, 144, 189, 20 );

label1 = [[UILabel alloc] initWithFrame: labelFrame1];

label1.tag=211;

label1.text=[NSString stringWithFormat:@"%@", [array1 objectAtIndex:0]];

[self.view addSubview: label1];

x=2;

create1.hidden=YES;

break;

case 2:

labelFrame1 = CGRectMake( 20, 144, 189, 20 );

labelFrame2 = CGRectMake( 20, 144+50, 189, 20 );

label2 = [[UILabel alloc] initWithFrame: labelFrame2];

label2.tag=212;

label2.text=[NSString stringWithFormat:@"%@", [array2

(47)

objectAtIndex:0]];

label1 = [[UILabel alloc] initWithFrame: labelFrame1];

label1.tag=213;

label1.text=[NSString stringWithFormat:@"%@", [array1 objectAtIndex:0]];

[self.view addSubview: label1];

[self.view addSubview: label2];

x=3;

create1.hidden=YES;

create2.hidden=YES;

break;

case 3:

labelFrame3 = CGRectMake( 20, 144+100, 189, 20 );

labelFrame1 = CGRectMake( 20, 144, 189, 20 );

labelFrame2 = CGRectMake( 20, 144+50, 189, 20 );

label3 = [[UILabel alloc] initWithFrame: labelFrame3];

label3.tag=214;

label3.text=[NSString stringWithFormat:@"%@", [array3 objectAtIndex:0]];

label2 = [[UILabel alloc] initWithFrame: labelFrame2];

label2.tag=215;

label2.text=[NSString stringWithFormat:@"%@", [array2 objectAtIndex:0]];

label1 = [[UILabel alloc] initWithFrame: labelFrame1];

label1.tag=216;

label1.text=[NSString stringWithFormat:@"%@", [array1 objectAtIndex:0]];

[self.view addSubview: label1];

[self.view addSubview: label2];

[self.view addSubview: label3];

[self.view addSubview: label2];

[self.view addSubview: label1];

x=4;

create1.hidden=YES;

create2.hidden=YES;

create3.hidden=YES;

break;

case 4:

labelFrame4 = CGRectMake( 20, 144+150, 189, 20 );

labelFrame3 = CGRectMake( 20, 144+100, 189, 20 );

labelFrame1 = CGRectMake( 20, 144, 189, 20 );

labelFrame2 = CGRectMake( 20, 144+50, 189, 20 );

label4 = [[UILabel alloc] initWithFrame: labelFrame4];

label4.tag=217;

label4.text=[NSString stringWithFormat:@"%@", [array4 objectAtIndex:0]];

(48)

label3 = [[UILabel alloc] initWithFrame: labelFrame3];

label3.tag=218;

label3.text=[NSString stringWithFormat:@"%@", [array3 objectAtIndex:0]];

label2 = [[UILabel alloc] initWithFrame: labelFrame2];

label2.tag=219;

label2.text=[NSString stringWithFormat:@"%@", [array2 objectAtIndex:0]];

label1 = [[UILabel alloc] initWithFrame: labelFrame1];

label1.tag=220;

label1.text=[NSString stringWithFormat:@"%@", [array1 objectAtIndex:0]];

[self.view addSubview: label4];

[self.view addSubview: label3];

[self.view addSubview: label2];

[self.view addSubview: label1];

x=5;

create1.hidden=YES;

create2.hidden=YES;

create3.hidden=YES;

create4.hidden=YES;

plus.hidden=YES;

break;

default:

break;

} z=z+1;

}

-(IBAction)reset:(id)sender{

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSMutableArray *array1 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array1"]];

NSMutableArray *array2 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array2"]];

NSMutableArray *array3 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array3"]];

NSMutableArray *array4 = [NSMutableArray arrayWithArray:[[NSUserDefau lts standardUserDefaults]objectForKey:@"array4"]];

[array1 removeAllObjects];

[array2 removeAllObjects];

[array3 removeAllObjects];

[array4 removeAllObjects];

(49)

[defaults setObject:array1 forKey:@"array1"];

[defaults setObject:array2 forKey:@"array2"];

[defaults setObject:array3 forKey:@"array3"];

[defaults setObject:array4 forKey:@"array4"];

[defaults synchronize];

reset.hidden=YES;

create1.hidden=NO;

create2.hidden=YES;

create3.hidden=YES;

create4.hidden=YES;

plus2.hidden=YES;

save1.hidden=YES;

save2.hidden=YES;

save3.hidden=YES;

save4.hidden=YES;

save5.hidden=YES;

save6.hidden=YES;

save7.hidden=YES;

save8.hidden=YES;

plus.hidden=YES;

for (int i = 1; i<231; i++) {

UIView *hideField = (UIView *)[self.view viewWithTag: i];

[hideField removeFromSuperview];

} x=1;

y=5;

z=1;

CGRect labelFrame = CGRectMake( 20, 144, 189, 20 );

UITextField *textField = [[UITextField alloc] initWithFrame:

labelFrame];

textField.borderStyle = UITextBorderStyleRoundedRect;

textField.text = @"Name workout session";

textField.textColor = [UIColor lightGrayColor];

textField.frame = labelFrame;

textField.tag = x;

[self.view addSubview: textField];

x=x+1;

}

- (void)viewDidLoad

References

Related documents

VARJE SPAR HAR DOCK INDIVIDUELL BERAKNAD LANGOMA TNING. BETECKNINGAR

Socialnämnden beslutar att godkänna förvaltningens förslag till ändringar i socialnämndens delegationsordning. Reservation

-Arvodesgruppen redovisar reviderat förslag av reglemente för ersättning till förtroendevalda vid kommunstyrelsens sammanträde i maj 2018. Sammanfattning

[r]

Varje boksida utgör en grupp av uppgifter, representerande ett visst avsnitt i kursplanen, så att varje sida räcker för t v å veckor, omkring 12 exempel.. Dessa barn önskar

Göra en processinriktad presentation av dokumentplanen/arkivförteckningen.. Dokumentplanering

&#34;att bifalla motionens första att-sats under förutsättningar att inrättande av &#34;Röda telefonen&#34; i Blekinge sker inom ra1nen för beslutad budget&#34;, &#34;att avslå

[r]