• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    F_OFRProgramovani pro OSX (IDE Xcode, Cocoa, Objektive-C, AppleScript)
    NUCLID
    NUCLID --- ---
    Hodil jsem na web prvni verejnou verzi TV Junkie, tak kdo ma zajem, stahujte na http://tvjunkie.proof.cz
    Je to muj prvni projekt v Objective-C / Cocoa, takze urcite je co doladovat, ale televizni program to ukazuje :)

    KUBBING
    KUBBING --- ---
    Ahoj, chci se zeptat ;). Jde vam zaplatit normalne kartou iPhone deve program ($99)? Me to pise, ze v CR neni Apple online store a mam udaje o karte faxovat do Applu. Diky
    QUITE
    QUITE --- ---
    NUCLID: omg.. on to fakt byl ten NSLog... :// to jsem netušil že může udělat takovej binec. Teď už to běží perfektně.
    Díky moc!!
    NUCLID
    NUCLID --- ---
    QUITE: Pridal jsem si jeste do plistu lastName s hodnotou true.
    Problem v tvem pripade byl nejspis ten, ze ses snazil vypisovat hodnotu v NSLog pomoci %@ ne? To na BOOL nefunguje. Bud ho vypises jako char, nebo to udelej jako ja. Kazdopadne normalne ti ted budou fungovat testy if (firstName)...
    NUCLID
    NUCLID --- ---
    QUITE:
    #import <Foundation/Foundation.h>
    
    int main (int argc, const char * argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
        NSString *filePath = @"quite.plist";
    	
        if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
    		NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
    		NSDictionary *dict = [array objectAtIndex:0];
    		
    		NSNumber *firstName = [dict objectForKey:@"firstName"];
    		NSNumber *lastName = [dict objectForKey:@"lastName"];
    
    		BOOL first = [firstName boolValue];
    		BOOL last = [lastName boolValue];
    		
    		NSLog(@"firstName = %@", first ? @"true" : @"false");
    		NSLog(@"lastName = %@", last ? @"true" : @"false");
    				
    		[array release];
        } else {
    		NSLog(@"%@ not found at %@", filePath, [[NSFileManager defaultManager] currentDirectoryPath]);
    	}
    	
        [pool drain];
        return 0;
    }
    


    Running…
    2010-01-28 19:34:38.955 PList[7633:a0f] firstName = false
    2010-01-28 19:34:38.958 PList[7633:a0f] lastName = true
    QUITE
    QUITE --- ---
    NUCLID:

    <plist version="1.0">
    <array>
    <dict>
    <key>firstName</key>
    <false/>
    <key>adresa</key>
    <string>http://www.seznam.cz</string>
    <key>trvani</key>
    <string>20 sec</string>
    </dict>
    </array>
    </plist>
    NUCLID
    NUCLID --- ---
    QUITE: muzes poslat ukazku toho plistu?
    QUITE
    QUITE --- ---
    NUCLID: dělá to totéž, s 0 to píše (null), s 1 to padne
    NUCLID
    NUCLID --- ---
    QUITE: Tohle taky nechodi?

    usedBOOL = [[[contactsFile objectAtIndex:0] objectForKey:@"firstName"] isEqual:@"1"];
    QUITE
    QUITE --- ---
    NUCLID: ne-e ,) firstName tam zůstalo z doby kdy jsem ten .plist poprvé rozjel a nahrál do něj sample data (to byl string), teď je ten key nastavený na bool a jsou tam jenom jedničky a nuly (checkboxy). ..a když jsem to zkoušel načítat jako NSString, psalo to sice 1 a 0 ale podmínkou to neprošlo (viz níž).
    NUCLID
    NUCLID --- ---
    QUITE: Jenom ze zvedavosti: opravdu mas pod klicem "firstName" ulozenej BOOL? Neni chyba v tom, ze se snazis delat BOOL z krestniho jmena?
    QUITE
    QUITE --- ---
    NUCLID: nic. jediný k čemu jsem došel je následující: když to načítam takhle:

    usedBOOL = [[contactsFile objectAtIndex:0] boolForKey:@"firstName"];

    Tak to padá jenom když je bool YES, když je NO, tak to vypíše že usedBOOL je (NULL) ale jede to dál.. Ale co to může znamenat nechápu..

    A když to rozložim tak to padá u boolValue... A console u toho taky nic nepíše...
    NUCLID
    NUCLID --- ---
    QUITE: Vis na cem presne to padne? Zkus ten radek rozebrat a udelej si pomocne promenne... jakoze vysledek objectAtIndex si uloz, pak nad tim zavolej objectForKey a pak boolValue. V debuggeru pak snadno zjistis, co se mu nelibi.
    QUITE
    QUITE --- ---
    QUITE: ostatní sloupce fungujou bezchybně (za předpokladu že jsou NSString)
    QUITE
    QUITE --- ---
    NUCLID: jj, tohle řešení jsem zkoušel.. ve tvaru:

    usedBool = [[[contactsFile objectAtIndex:jsmeNaRadkuDat] objectForKey:@"firstName"] boolValue];

    (zkoušel jsem usedBool jako BOOL i jako int)

    Problém je, že to celý na tomhle řádku bez jediný hlášky nebo chyby v Console.app padne.. Dokonce i když je ten .plist prázdnej, spustim, pomocí NSTableView (NSArrayController) tam něco nahraju. V momentě kdy nahraju data, dojdu na řádek, konec.
    NUCLID
    NUCLID --- ---
    QUITE: Property list je textovej soubor, kterej si nenese informaci o datovym typu. V Objective-C je BOOL definovanej jako unsigned char a stejne dobre ti poslouzi treba integer. Takze kdyz z plistu ctes hodnotu, musis vedet, jakej datovej typ to je - v tomhle pripade BOOL - a prevest ji na ten typ:

    BOOL checkBox = [[plistDictionary objectForKey:@"CheckBox"] boolValue];
    QUITE
    QUITE --- ---
    NUCLID: ještě jednu věc, v jednom sloupci mi NSArrayController do .plistu ukládá hodnotu checkboxu jako BOOL. když jí pak načtu jako string, nepomůže ani isEqual. Je otázka jestli nějak nutit NSArrayController ukládat to jako string a nebo jestli ten string pak nějak převádět na bool...každopádně pomocí objectAtIndex: a objectForKey: je možný načítat data jenom do stringu... Takže jsem zase v p... Nějakej nápad? ,)
    VIRUS31
    VIRUS31 --- ---
    Absence multitaskingu me (zatim) nijak nevadi. A chapu politiku applu udrzet vykon pri behu aplikace tim, ze jsou ostatni sestrelene. Vezmu-li v potaz mobilni windows, kde se vsechno kouse, omezeni multitaskingu mi prijde jako dobrej krok. Ale o tom uz probehlo x debat, takze bych to nechal jak je.

    Idealni by bylo mit na iPad samotny Xcode, aby se dalo prgat mobilne bez potreby mit meka na kolenou. Ale to asi nehrozi :)
    NUCLID
    NUCLID --- ---
    QUITE: Kdyz porovnavas stringy jako [myString == @"neco"], tak problem je v tom, ze konstrukce @"neco" vytvori novou instanci NSString a operator == porovnava adresy v pameti. Je mu jedno, ze stringy jsou stejne, pro nej to jsou dva objekty na jinych adresach a tudiz nejsou shodne.

    Jinak if() imho testuje nenulovost argumentu, takze by ti melo stacit if ([durationString isEqual:@"5 sec"]), ale to je jen kosmetika.
    QUITE
    QUITE --- ---
    NUCLID: ty jsi chyytreej! ,) Je to tak! : if ([durationString isEqual:@"5 sec"] == YES) ..lalala. Díky!

    Co se týče iPadu, mě zklamalo že to nemá regulerní OS X.. A to asi nejvíc.. Jinak je to pěknej kousek, hudba budoucnosti. ,)
    Kliknutím sem můžete změnit nastavení reklam