Clădire aplicații native iOS cu ceară Introducere

Ideea din spatele cadrului Wax este simplă: orice Obiectiv-C poate face, Lua poate face și el! Există o mulțime de motive bune pentru a lua în considerare crearea de aplicații native iPhone cu un limbaj de scripting simplu și eficient, cum ar fi Lua, iar această serie de tutori se va arunca cu vederea în beneficiile oferite de Wax, în timp ce demonstrează pașii practici necesari pentru a integra Lua cu Xcode 4 și iOS SDK.

Ce este Wax?

Wax for iPhone este un cadru scris într-un mod care unește limba de scripting Lua și API-urile native Obiectiv-C. Aceasta înseamnă că puteți utiliza oricare dintre clasele și cadrele obiectivului C din cadrul Lua.

În termeni tehnici, Wax este o combinație de clase Obiectiv-C și cod nativ C. Limba Lua este încorporată cu C, iar apoi clasele Obiectiv-C sunt îmbinate în mix.

De ce să folosiți ceara?

Ceara este gratuit și open-source. Spre deosebire de alte soluții bazate pe Lua pentru dezvoltarea mobilă, Wax este un cadru open source care necesită doar să investești puțin timp pentru a lucra, nu pentru bani. Nu vă place cum funcționează Wax sau găsiți o eroare în implementare? Codul sursă este disponibil gratuit și îl puteți modifica întotdeauna pentru a se potrivi nevoilor dvs..

Poti leagă API-urile native. Aceasta înseamnă că tutorialele scrise pentru a preda Obiectiv-C pot fi ușor adaptate și scrise cu Lua pentru Wax. Acest lucru înseamnă, de asemenea, că aplicația dvs. va arăta mereu și se va simți nativă, dar totuși aveți în continuare avantajul de a vă scrie codul în Lua, o limbă eficientă de scripting.

Ai ajuns folosiți Xcode. Acest lucru înseamnă că atât implementarea simulatorului, cât și cea a dispozitivului este o soluție rapidă și nu ar trebui să se rupă cu ușurință cu o versiune viitoare de iOS.

Ai ajuns utilizarea tuturor bibliotecilor existente ale obiectivului C. Dacă aveți o clasă Obiectiv-C pe care ați scris-o mai înainte, o puteți folosi în Lua - fără adaptări - doar o aruncați în Xcode. Același lucru este valabil și pentru biblioteci ca Trei. Doar adăugați-le pe instrucțiunile normale și aveți acces la ele în codul Lua.

Ai ajuns folosirea modulelor Wax Lua. Wax are câteva module construite în module Lua care fac cereri HTIN asincrone și crearea / parsarea JSON incredibil de ușor și rapid (deoarece modulele sunt scrise în C).

Tu nu trebuie să gestionați memoria. Nu mai există alocarea de memorie și altele asemenea. Ceara se ocupă de toate astea pentru tine.

Tipurile Lua sunt convertite automat în echivalente Obiectiv-C și invers. Aceasta înseamnă că atunci când apelați o metodă care are nevoie de un NSString și un NSInteger, dar veți trece un șir Lua și un număr întreg Lua, Wax va avea grijă de asta. Această conversie este chiar suficient de puternică pentru a trata caracteristicile complexe ale obiectivului C, cum ar fi selectorii.

Ai ajuns utilizează toate cele de mai sus. Nu este nevoie să alegeți și să alegeți. Ai obținut totul!

Bine, asta e minunat! Cum instalez ceara?

Ei bine, mai întâi aveți nevoie de Xcode și SDK-ul iPhone. Dacă încă nu ai acelea, du-te!

Crearea proiectului în Xcode

Să începem să creăm un nou "Proiect bazat pe ferestre" numit "WaxApplication". Nu uitați să setați dispozitivul pe iPhone:

Navigați la dosarul în care ați salvat acest proiect în Finder. Creați trei dosare noi: ceară, scripturi și clase. Dosarul dvs. ar trebui să arate astfel:

Configurarea ceară (partea 1, manipularea fișierelor)

Mai întâi, descărcați un zip al codului sursă. Wax este găzduit pe GitHub, ceea ce face ca descărcarea codului sursă să fie foarte ușoară. Descărcați zipul de aici.

Acum, dezarhivați noul fișier descărcat. Navigați la dosarul nou extras. Se va numi ceva de genul "probabilcorey-ceara-124ca46".

Ecranul ar trebui să arate astfel:

Acum efectuați următoarele acțiuni:

  • Copiați folderul lib și bin și lipiți-le în folderul de ceară din dosarul proiectului WaxApplication.
  • Copiați xcode-template / Classes / ProtocolLoader.h în folderul proiectului WaxApplication.
  • Copiați folderul xcode-template / scripts / și plasați-l în folderul proiectului WaxApplication.
  • Deschideți directorul wax / lib / extensions / folderul din folderul proiectului WaxApplication. Ștergeți directorul SQLite & xml prezentat mai jos:

Ecranul dvs. ar trebui să arate astfel:

Configurarea ceară (partea 2, configurarea proiectului)

Acum, selectați clasele, scripturile și dosarele de ceară din Finder și trageți-le în proiectul Xcode. Aruncați-le chiar sub bara care afișează "Aplicație pentru ceară" și "O destinație, iOS SDK X.X". Debifați caseta de selectare "Copiați articolele în dosarul grupului de destinație (dacă este necesar)". Faceți clic pe terminați.

Faceți clic pe bara care afișează "Aplicație pentru ceară" și "1 destinație, SDK iOS 4.3". Acum urmați pașii următori:

  • În panoul din dreapta, căutați antetul "Targets" și faceți clic pe "WaxApplication". Faceți clic pe fila "Construiți fazele". Faceți clic pe "Copiere resurse Bundle" și eliminați toate fișierele lua.
  • În colțul din dreapta jos, dați clic pe "Adăugați faza de construire", apoi pe "Adăugați Run Script"
  • Setați Shell în / bin / zsh
  • Setați aria textului de sub Shell la "" $ PROJECT_DIR / wax / lib / build-scripts / copy-scripts.sh ""

Ecranul ar trebui să arate astfel:

Modificarea main.m

În panoul din stânga, deschideți directorul numit "WaxApplication". Apoi deschideți dosarul "Fișiere suport". Apoi, deschideți main.m și înlocuiți conținutul fișierului cu acesta:

 // Aici se petrece magia! // Ceara nu utilizează pensule pentru a încărca vizualizarea principală, totul se face în fișierul // AppDelegate.lua #import  #import "wax.html" #import "wax_http.h" #import "wax_json.h" #import "wax_filesystem.h" int principal (int argc, char * argv []) NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; wax_start ("AppDelegate.lua", luaopen_wax_http, luaopen_wax_json, luaopen_wax_filesystem, nil); int retVal = UIApplicațieMain (argc, argv, nil, @ "AppDelegate"); [eliberarea bazinului]; return retVal; 

Nu uitați să salvați fișierul!

Ștergerea fișierelor inutile

Ștergeți fișierele MainWindow.xib, WaxApplicationAppDelegate.h și WaxApplicationAppDelegate.m. Deschideți "WaxApplication / Support Files / WaxPallication-Info.plist" și apoi ștergeți linia în care este ".

Testarea instalării ceara

Presa ?? (Command + Enter) sau apăsați? Run? în colțul din stânga sus pentru a rula aplicația în simulator. Dacă totul a funcționat, veți vedea o aplicație simplă care spune "Hello Lua!".

Dacă nu vedeți acest mesaj, examinați pașii anteriori și vedeți dacă ați ratat un pas.

Privind la Lua

Extindeți colecția Scripturi și deschideți AppDelegate.lua. Acum vedeți codul Lua care execută această aplicație.

Primul lucru pe care probabil îl veți observa este că nu există o evidențiere a sintaxei. Din păcate, nu am găsit o soluție stabilă pentru evidențierea sintaxei Lua în Xcode (dar dacă o găsiți, vă rugăm să postați unul în comentarii!).

Cel de-al doilea lucru pe care probabil îl veți observa este că nu există paranteze pătrate, dar sunt folosite clase precum UIScreen și UIWindow. Acest lucru se datorează faptului că faceți o clasă AppDelegate în Lua și, în măsura în care Apple și codul Apple vă pot spune, folosiți obiectivul C și realizarea obiectivelor C!

Numele de metode

Este posibil să observați și numele metodei ciudate "colorWithRed_green_blue_alpha". Dacă sunteți familiarizat cu Obiectiv-C, veți ști că numele metodelor poate avea colonii. Nu puteți avea colonii în nume de funcții în Lua. Pentru a compensa această diferență, în orice loc, un nume de metodă este împărțit în Obiectiv-C, în Lua are un subliniere. De exemplu:

  • colorWithRed: verde: albastru: alfa în Obiectiv-C isiaccolorWithRed_green_blue_alpha în Lua
  • selectRowAtIndexPath: animat: scrollPosition: în Obiect-C este selectațiRowAtIndexPath_animated_scrollPosition în Lua.

Modelul orientat pe obiect

O altă problemă cu Lua este că nu are un sistem de moștenire ca Obiectiv-C. Nu există clase la Lua. Pentru a rezolva această problemă, Wax expune o funcție care se află în partea de sus a fiecărui fișier Wax Lua: waxClass. În AppDelegate.lua implicit, linia arată astfel:

 waxClass "AppDelegate", protocoale = "UIApplicationDelegate"

Pentru a crea o clasă Obiectiv-C de la Lua, se folosește funcția waxClass "CLASS NAME", "PARENT_CLASS". Toate funcțiile ulterioare (în același fișier) pe care le adăugați la acel fișier Lua vor fi adăugate automat la noua dvs. clasă ca metode de instanță.

După cum arată linia din AppDelegate.lua, puteți defini, de asemenea, ce protocoale definește "clasa" dvs..

Deși waxClass rezolvă problema de a defini clasele pentru utilizarea de către Obiectiv-C, există încă problema că, din moment ce Lua nu are clase, nu are o variabilă dinamică "de sine" ca Obiectiv-C. Pentru a face acest lucru, Wax face automat primul argument pentru fiecare metodă a instanței actuale a clasei. Puteți vedea atunci când priviți la "applicationDidFinishLaunching" în AppDelegate.lua, primul argument este "self", eveniment, deși versiunea Objective-C a acestei metode are doar 1 argument. Cu toate acestea, ar fi foarte enervant dacă trebuia să treci instanța curentă a clasei ca fiind primul argument pentru fiecare metodă, așa că s-au adăugat niște zahăr sintactic. În loc de a face o "metodă" de apel în Lua folosind "." operator, operatorul "colon" este utilizat:

 vizualizare locală = UIView.initWithFrame (CGRect (0, 0, 100, 100)) - următoarele sunt exact aceeași vizualizare: addSubview (someView) view.addSubview (view, someView)

Un alt lucru important este faptul că Wax nu suportă proprietățile Obiect-C. Wax forțează Lua și Obiectiv-C să comunice doar cu metode.

 -- Acest lucru nu va funcționa. someView.frame - doriți să utilizați metodele getter / setter în locul someView: frame () someView: setFrame (someFrame)

Lua-variabile numai

Puteți crea dinamic variabilele membrilor pentru orice obiect Obiectiv-C folosind punctul. operator. Spre deosebire de operatorul colon: (folosit pentru a apela metodele pe o clasă / instanță obiectiv / C) punctul. operator creează dinamic variabilele membre pe partea Lua a obiectului (Partea Objective-C a obiectului nu cunoaște aceste variabile). Variabilele membre sunt disponibile pe toată durata de viață a obiectului.

Ieșirea la consola

AppDelegate.lua arată, de asemenea, modul în care puteți scrie text de depanare la consola. Utilizați funcția "pune".

Gestionarea memoriei

Dacă vă amintiți, am promis că nu va trebui niciodată să alocați, să vă păstrați și să vă eliberați cu Lua. Nu trebuie niciodată să apelați alocarea înainte de a apela oricare dintre inițiatici. De fapt, dacă o faci, programul tău probabil va pierde memoria.

Minunat! Ce urmeaza?

Acum, că aveți o înțelegere puternică cu privire la elementele de bază ale Lua specifice Wax, sunteți gata să scrieți o aplicație pentru iPhone!

În partea a doua a acestui tutorial, vom face o mostră de aplicații Twitter cu un buton de reîmprospătare folosind doar câteva linii de Lua.

Cod