Viser arkivet for stikkord cocoa

Cocoa bindinger for ruby

Hei folkens. Jeg har prototypet frem ruby bindinger for cocoa og katten begynner så sakte men sikkert å titte litt ut av sekken. Enkelte finesser trengs å modnes litt, men jevnt over har man alt av cocoa på fingertuppene svært nært opp mot praktisk bruk i Objective-C.

Det hadde vært helt knall om noen litt nærmere hjemme også har bruk for dette og ønsker å involvere seg. Ruby trengs også på desktopen, og er desverre ikke spesielt brukbar ennå.

Cocoa på github.

Noe eksempler på faktisk bruk av coca i opine

Data fra Rails på Mac/iPhone

ObjectiveResourcePreview

Vi var en gjeng som satt sammen og lærte oss Objective C sammen igår, og langt utpå kvelden fikk vi det for oss at vi skulle se hva som skal til for å få tak i data fra Rails inn i en Mac-applikasjon. Stikkordet er (selvsagt) ActiveResource, og det tok faktisk ikke så lang tid å få noe til å fungere.

Vi tok utgangspunkt i brukerlista fra Beast på Smidig.no-forumet – og laget en klasse Person med en metode findAll som returnerer noen Person-objekter fra Beast. Da vi hadde fått noe til å fungere trakk vi funksjonaliteten ut fra Person-klassen til en ActiveResource-klasse og fikk Person-klassen til å arve fra denne istedet – dermed hadde vi en klasse som man kan extende i sin egen klasse og som deretter mer eller mindre kan hente ut objekter fra en hvilken som helst Rails-applikasjon.

Vi diskuterte en god del fram og tilbake om vi skulle la feltene/variablene vi får fra ActiveResource være instansvariabler definert i klassen eller om vi skulle bruke et hash (en dictionary i Objective C), og endte opp med det første – altså at man må deklarere instansvariablene i klassen. Dermed må man i header-fila for klassen sin (Person i dette tilfellet) deklarere hvilke attributter som finnes i modellen. I tillegg må man implementere en klassemetode som returnerer URLen man henter objektene fra i klassen


@implementation Person
+(NSString *)site {
	return @"http://forum.smidig.no/users.xml";
}
@end

@interface Person : ActiveResource {
	id bio;
	id bio_html;
	id display_name;
        // Legg til flere nedenfor
}
@end

Da jeg så kom hjem bare måtte jeg se hvor vanskelig det kunne være å legge et GUI oppå dette. Jeg laget meg et nytt Cocoa application-prosjekt i XCode, kopierte inn ActiveResource og Person klassene inn i prosjektet, la inn en tabell (NSTableView) og laget en liten controller. Jeg anga at controlleren min skulle være data source for tabell-viewet – slik at denne får ansvaret for å levere innhold til tabellen.

Måten dette fungerer på i Cocoa er at et objekt som er data source for en slik tabell må svare på to metoder som tabellen sender til den når det er nødvendig:

  • en metode som returnerer antall rader tabellen skal inneholde
  • en metode som returnerer et objekt som skal vises i en angitt kolonne i en angitt rad i tabellen

Jeg satte derfor controlleren opp til å lage et array people ved initialisering, som inneholder resultatet av findAll-metoden til Person-klassen – og returnerer deretter antall elementer i dette arrayet som svar på den første metoden over (antall rader tabellen skal inneholde).

Deretter anga jeg en identifikator for hver av kolonnene i tabellen som er den samme som navnet på instansvariabelen jeg ønsker å hente fra Person-objektet. Slik kunne jeg bruke Key Value Coding til å hente riktig verdi fra objektet i controlleren:


-(id)tableView:(NSTableView *)tv 
	objectValueForTableColumn:(NSTableColumn *)tableColumn
		   row:(int)row
{
	Person *currentPerson = [people objectAtIndex:row];
	return [currentPerson valueForKey:[tableColumn identifier]];
}

Klikket “Build and Go” og fikk opp skjermbildet du ser et annet sted på siden. Om du har veldig lyst å prøve å kjøre appen finner du den her

Ettersom iPhone-plattformen er omtrent identisk med “vanlig” Cocoa regner jeg ikke med å bruke mye tid på å lage en iPhone-versjon av samme “applikasjon”, den største forskjellen blir nok mangelen på garbage collection på iPhone. Jeg mistenker at det vil være veldig praktisk å ha tilgang på Rails-data gjennom en Objective C-variant av ActiveResource for alle de iPhone-applikasjonene som finnes der ute.

Noen som vil være med på neste Cocoa night og lære Objective C sammen?