Oppbygging av native iOS-programmer med voks Introduksjon

Ideen bak Wax-rammen er enkel: Alt Mål-C kan gjøre, Lua kan også gjøre! Det er mange gode grunner til å vurdere å skape innfødte iPhone-applikasjoner med et enkelt og effektivt skriptspråk som Lua, og denne opplæringsserien vil dykke inn i fordelene som tilbys av Wax, samtidig som man demonstrerer de praktiske trinnene som er nødvendige for å integrere Lua med Xcode 4 og iOS SDK.

Hva er voks?

Wax for iPhone er et rammeverk skrevet på en måte som brer Lua skriptspråk og de innfødte Objective-C APIene. Dette betyr at du kan bruke alle Objective-C-klasser og -rammer fra Lua.

I tekniske termer er Wax en kombinasjon av Objective-C klasser og innfødte, C-kode. Lua-språket er innebygd med C, og deretter blir mål-C-klassene sammenslåtte i blandingen.

Hvorfor bruke Wax?

Voks er gratis og åpen kildekode. I motsetning til noen andre Lua-baserte løsninger for mobilutvikling, er Wax et open-source rammeverk som bare krever at du investerer litt tid for å jobbe, ikke penger. Liker ikke hvordan Wax fungerer eller finner en feil i implementeringen? Kilden er fritt tilgjengelig, og du kan alltid endre den slik at den passer til dine behov.

Du kan utnytte innfødte APIer. Dette betyr at opplæringer skrevet for å undervise Mål-C kan enkelt tilpasses og skrives med Lua for Wax. Dette betyr også at appen din alltid vil se ut og føle seg hjemme, men du har fortsatt den tidsbesparende fordelen ved å skrive koden i Lua, et effektivt skriptspråk.

Du kommer til bruk Xcode. Dette betyr at både simulator og enhetsutplassering er et snap, og bør ikke bryte enkelt med en fremtidig iOS-utgave.

Du kommer til utnytte alle eksisterende mål-C-biblioteker. Hvis du har en Objektiv-C-klasse som du har skrevet før, kan du bruke den i Lua - uten tilpasninger - du kaster den bare inn i Xcode. Det samme gjelder for biblioteker som Three20. Bare legg dem til i henhold til de normale instruksjonene, og du har tilgang til dem i Lua-koden din.

Du kommer til utnytte Wax Lua-moduler. Wax har noen få bygget i Lua-moduler som gjør asynkron HTTP-forespørsler og JSON-opprettelse / -parsing utrolig enkelt og raskt (fordi modulene er skrevet i C).

Du trenger ikke å administrere minne. Ikke mer minneallokering og lignende. Wax håndterer alt det for deg.

Lua typer konverteres automatisk til Objective-C ekvivalenter og vice versa. Dette betyr at når du ringer en metode som trenger en NSString og en NSInteger, men du sender en Lua-streng og et Lua-heltall, vil Wax ta vare på det for deg. Denne konverteringen er til og med kraftig nok til å håndtere komplekse objektiv-C-funksjoner som selektorer.

Du kommer til utnytte alle de ovennevnte. Du trenger ikke å velge og velge. Du får alt!

Ok, dette er kjempebra! Hvordan installerer jeg Wax?

Vel, først trenger du Xcode og iPhone SDK. Hvis du ikke har dem ennå, må du få dem!

Opprette prosjektet i Xcode

La oss starte med å lage et nytt "Window-based project" kalt "WaxApplication". Ikke glem å sette enheten til iPhone:

Naviger til mappen der du lagret dette prosjektet i Finder. Opprett tre nye mapper: voks, skript og klasser. Mappen din skal se slik ut:

Sette opp voks (del 1, filmanipulering)

Først last ned en kodenavn for kildekoden. Wax er vert på GitHub, slik at det blir enkelt å laste ned kildekoden. Last ned posten herfra.

Unzip den nylig nedlastede filen. Naviger til den nylig utpakkede mappen. Det vil bli kalt noe som "probablycorey-wax-124ca46".

Skjermen din skal nå se slik ut:

Gjør nå følgende handlinger:

  • Kopier lib og bin-mappen og lim dem i voksmappen i WaxApplication-prosjektmappen.
  • Kopier xcode-template / Classes / ProtocolLoader.h til WaxApplication-prosjektmappen.
  • Kopier xcode-malen / skript / mappen og plasser den i WaxApplication-prosjektmappen.
  • Åpne voks / lib / utvidelser / mappen i WaxApplication-prosjektmappen. Slett SQLite & XML-mappen på bildet nedenfor:

Skjermen din skal se slik ut:

Sette opp voks (del 2, konfigurere prosjektet)

Velg nå klassene, skriptene og voksmappene i Finder, og dra dem inn i Xcode-prosjektet. Slip dem rett under linjen som sier "Wax Application" og "1 target, iOS SDK X.X". Fjern merket i avkrysningsruten som sier "Kopier elementer til destinasjonsgruppens mappe (om nødvendig)". Klikk på ferdig.

Klikk nå på linjen som sier "Wax Application" og "1 target, iOS SDK 4.3". Gjør nå følgende trinn:

  • I den høyre ruten lete etter "Mål" -overskriften og klikk "WaxApplication". Klikk på "Bygg faser" -fanen. Klikk "Kopier Bundle Resources" og fjern alle Lua-filene.
  • I nederste høyre hjørne klikker du på "Legg til byggefase" og deretter "Legg til kjøreskript"
  • Sett Shell til / bin / zsh
  • Sett tekstområdet under Shell til "" $ PROJECT_DIR / wax / lib / build-scripts / copy-scripts.sh ""

Skjermen din skal nå se slik ut:

Endre main.m

I venstre ruten åpner du mappen som heter "WaxApplication". Deretter åpner du mappen "Støttende filer". Deretter åpner du main.m og erstatter innholdet i filen med dette:

 // Dette hvor magien skjer! // Wax bruker ikke nib til å laste hovedvisningen, alt er gjort i // AppDelegate.lua-filen #import  #import "wax.h" #import "wax_http.h" #import "wax_json.h" #import "wax_filesystem.h" int main (int argc, char * argv []) NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] i det]; wax_start ("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, null); int retVal = UIApplicationMain (argc, argv, null, @ "AppDelegate"); [utgivelse av basseng]; returner retVal; 

Ikke glem å lagre filen!

Slette unødvendige filer

Slett MainWindow.xib, WaxApplicationAppDelegate.h og WaxApplicationAppDelegate.m filer. Åpne "WaxApplication / Supporting Files / WaxPallication-Info.plist" og slett deretter linjen der nøkkelen er "Main nib filbasenavn".

Tester din Wax-installasjon

Trykk ?? (Kommando + Enter) eller trykk? Kjør? i øverste venstre hjørne for å kjøre appen i simulatoren. Hvis alt fungerte, vil du se en enkel app som sier "Hei Lua!".

Hvis du ikke ser denne meldingen, vurderer du de forrige trinnene og ser om du har gått glipp av et trinn.

Ser på Lua

Utvid Skriptsamlingen og åpne AppDelegate.lua. Du ser nå Lua-koden som driver denne appen.

Det første du vil legge merke til er at det ikke er syntaxutheving. Dessverre har jeg ikke funnet en stabil løsning for Lua syntaksutheving i Xcode (men hvis du finner en, vennligst legg inn en i kommentarene!).

Den andre tingen du sannsynligvis vil legge merke til er at det ikke er noen firkantede parenteser, men likevel blir klasser som UIScreen og UIWindow brukt. Dette skyldes at du lager en AppDelegate-klasse i Lua, og så langt som Apple og Apples kode kan fortelle, bruker du Objective-C og gjør mål-C-klasser!

Metode navn

Du kan også merke det merkelige metodenavnet "colorWithRed_green_blue_alpha". Hvis du er kjent med Objective-C, vil du vite at navnet på metodene kan ha kolon. Du kan ikke ha kolon i funksjonsnavn i Lua. For å kompensere for denne forskjellen, på et hvilket som helst sted et metodenavn er oppdelt i Mål-C, har Lua understreket. For eksempel:

  • colorWithRed: grønn: blå: alfa i objektiv-C isjaolor med rødt_green_blue_alpha i lua
  • selectRowAtIndexPath: animated: scrollPosition: i Objective-C er selectRowAtIndexPath_animated_scrollPosition i Lua.

Den objektorienterte modellen

Et annet problem med Lua er at det ikke har et arvssystem som Objective-C. Det er ingen klasser i det hele tatt i Lua. For å løse dette problemet eksponerer Wax en funksjon som går øverst på hver Wax Lua-fil: waxClass. I standard AppDelegate.lua ser linjen slik ut:

 waxClass "AppDelegate", protokoller = "UIApplicationDelegate"

For å lage en Objective-C klasse fra Lua, brukes funksjonen waxClass "CLASS NAME", "PARENT_CLASS". Alle etterfølgende funksjoner (i samme fil) du legger til Lua-filen, blir automatisk lagt til din nye klasse som eksempelmetoder.

Som linjen fra AppDelegate.lua viser, kan du også definere hvilke protokoller din "klasse" definerer.

Selv om waxClass løser problemet med å definere klasser for bruk av Objective-C, er det fortsatt problemet at siden Lua ikke har klasser, har den ikke en dynamisk "selv" variabel som Objective-C. For å komme seg rundt dette, gjør Wax automatisk det første argumentet for hver metode den nåværende forekomsten av klassen. Du kan se når du ser på "applicationDidFinishLaunching" i AppDelegate.lua, det første argumentet er "selv", hendelse, selv om Objective-C-versjonen av denne metoden bare har 1 argument. Det ville imidlertid være veldig irriterende om du måtte passere dagens forekomst av klassen som det første argumentet for hver metode, så det ble lagt til noe syntaktisk sukker. I stedet for å lage en "metode" ringe i Lua ved hjelp av "." operatør, brukes "kolon" operatør:

 lokal visning = UIView.initWithFrame (CGRect (0, 0, 100, 100)) - Følgende er akkurat det samme: addSubview (someView) view.addSubview (se, noenView)

En annen viktig ting å merke seg er at Wax ikke støtter Objective-C egenskaper. Voks krefter Lua og Objective-C å bare kommunisere med metoder.

 -- Dette vil IKKE fungere. someView.frame - Du vil bruke getter / setter metoder i stedet someView: frame () someView: setFrame (someFrame)

Lua-eneste variabler

Du kan dynamisk opprette medlemsvariabler for et objektiv-C-objekt ved hjelp av punktumet. operatør. I motsetning til kolon: operatør (brukes til å ringe metoder på en Objective-C klasse / instans) prikken. operatør oppretter dynamisk medlemsvariabler på lua-siden av objektet (objektiv-C-siden av objektet har ingen kjennskap til disse variablene). Medlemsvariablene er tilgjengelige gjennom hele levetiden til objektet.

Utgang til konsollen

AppDelegate.lua viser også hvordan du kan skrive feilsøkingstekst til konsollen. Du bruker funksjonen "setter".

Minnehåndtering

Hvis du husker, lovte jeg at du aldri ville måtte tildele, beholde og slippe med Lua. Du trenger aldri å ringe allokering før du ringer til noen av initiatørene. Faktisk, hvis du gjør det, vil programmet trolig minnelekkasje.

Rått! Hva blir det neste?

Nå som du har en sterk forståelse for det grunnleggende om Wax-spesifikke Lua, er du klar til å skrive en iPhone-app!

I del 2 av denne opplæringen vil vi lage et eksempel på Twitter-appen med en oppdateringsknapp med bare noen få linjer av Lua.