9 berichten aan het bekijken - 1 tot 9 (van in totaal 9)
  • Q:
    Bijdrager
    popsickle

    NSBezierPath en arrays

    Het “Cocoa programming for mac os x”-boek volgende, zit ik bij de challenge van hoofdstuk 15 een beetje vast.:)
    Er wordt een custom view gemaakt waarop je ovalen kan tekenen door met je muis te klikken en te slepen. Dit werkt bij mij, maar elke keer ik een nieuwe ovaal teken, gaat de vorige weg.
    Dus dacht ik, ik maak een array aan van NSBezierPaths en laad die dan op mijn view. En daar zit ik vast, op dit moment wil ik het NSBezierPath object in mijn array toevoegen in de -mouseUp methode, en die array laden in de -drawRect methode. Dit lukt niet echt.

    [code:1:bf0ab8b8d9]- (void)mouseUp:(NSEvent *)event
    {
    NSPoint p = [event locationInWindow];
    currentPoint = [self convertPoint:p fromView:nil];
    [ovalArray addObject:path];
    NSLog(@"ovalArray count: %@", [ovalArray count]);
    [self setNeedsDisplay:YES];
    }[/code:1:bf0ab8b8d9]

    [code:1:bf0ab8b8d9]- (void)drawRect:(NSRect)rect
    {
    NSRect bounds = [self bounds];
    [[NSColor whiteColor] set];
    [NSBezierPath fillRect:bounds];
    [[NSColor greenColor] set];
    NSEnumerator *e = [ovalArray objectEnumerator];
    while (path = [e nextObject]) {
    [path fill];
    }
    path = [NSBezierPath bezierPathWithOvalInRect:[self currentRect]];
    [path fill];
    }[/code:1:bf0ab8b8d9]

    ’t zou kunnen dat ik er redelijk naast zit, maar na een uur of 2 zoeken weet ik niet echt wat ik verkeerd doe. Als ik zogezegd het object aan de array toevoeg staat mijn array count nog altijd op nil. Is er een betere manier om dit op te lossen? (Of een hint naar de juiste oplossing :))

    Bijdrager
    silvercircle

    Ik zou wat meer moeten zien van je code om je te helpen.
    Kan je misschien je project ergens als archief plaatsen en mij een PB sturen met de link?

    Inactief
    Anoniem

    Je moet je array wel eerst initialiseren. Als je [array count] nil terug geeft is deze niet geinstantieerd. (In objective-C kun je messages sturen naar nil zonder dat dit een probleem oplevert, de standaard return value is dan nil)

    je moet je array dus eerst even initialiseren. Daarnaast is het natuurlijk een leuke oefening met arrays (let wel op dat je de NSMutableArray gebruikt), maar als je de docs van NSBezierPath leest, zie je dat er een appendBezierPathWithOvalInRect: functie is waarmee je een ovaal toe kunt voegen aan een bestaand pad..

    Tip: Nagenoeg iedere Foundation/AppKit class kun je gewoon in google invoeren, en google geeft je direct de doc van Apple:)

    Bijdrager
    a la Mac
    ”Reflex”

    Tip: Nagenoeg iedere Foundation/AppKit class kun je gewoon in google invoeren, en google geeft je direct de doc van Apple:)

    Of Xcode –> Help –> Documentation;)

    Door op het vergrootglas van Spotlight te drukken kan je kiezen voor API Search en in de linkerkolom voor Cocoa.

    Hoef je niet elke keer Safari te starten;)

    Inactief
    Anoniem

    De offline documentatie vind ik minder fijn navigeren dan de online… En ik denk dat het merendeel Safari toch wel altijd aan heeft;)

    Offline docs zijn handig voor in de trein..

    nog een tip dan maar: Dubbelclick op een class of method name in Xcode terwijl je de command toets ingedrukt houdt… Xcode brengt je dan naar de headerfile van die class..

    Bijdrager
    popsickle

    Het probleem is opgelost, de array heb ik geinitialiseerd, en het aanmaken van het NSBezierPath object naar mouseUp verschoven. De apple docs over NSBezierPath had ik al bekeken, het probleem was eerder dat ik een object in het array wou toevoegen dat op dat moment nog niet bestond, aangezien -drawRect pas na -mouseUp wordt uitgevoerd.

    Toch bedankt voor de tips:)

    Inactief
    Anoniem

    Je kunt perfect een object aan een niet bestaande array toevoegen, zoals ik al aangaf doen messages naar nil niets. Dus je voegt niets toe, en je krijgt ook geen error…

    Let tevens op dat drawRect niet perse na mouseUp aangeroepen wordt. Sterker nog, het hoeft helemaal niet aangeroepen te worden, of kan op andere momenten aangeroepen worden. In dit geval wordt het altijd aangeroepen na mouseUp omdat je vraagt om de view te verversen met setNeedsDisplay, maar dit kan het systeem ook op eigen houtje willen doen:) Vertrouw er dus niet op dat die events altijd in dezelfde volgorde plaats hebben!

    Bijdrager
    popsickle

    Om nog maar eventjes verder de opdracht te verfijnen, volgens mij kan de array best uit de view genomen worden om conform te zijn aan MVC structuur.
    Dus, aangezien dit een klein (document-based) programmaatje is, kan de standaard MyDocument class wel als model en controller class dienen. Maar hoe verbind ik de view met de controller (die de NSMutableArray met bezier paths bevat)?
    Ik heb ergens gelezen dat je vanuit je view [[[self window] windowController ] document] kan aanroepen, maar iets doet mij vermoeden dat er een mooiere (of betere oplossing is). Notifications gebruiken lijkt mij overkill om iets op te lossen wat volgens mij eenvoudiger kan, maar ik kom er ff niet.
    Wat is de beste oplossing om een custom view te verbinden met je controller class?

    Bijdrager
    a la Mac
    ”Reflex”

    De offline documentatie vind ik minder fijn navigeren dan de online… En ik denk dat het merendeel Safari toch wel altijd aan heeft;)

    Offline docs zijn handig voor in de trein..

    nog een tip dan maar: Dubbelclick op een class of method name in Xcode terwijl je de command toets ingedrukt houdt… Xcode brengt je dan naar de headerfile van die class..

    En met Option+dubbelklik opent hij hem meteen in de handleiding;)

    O ja, als Safari makkelijker is om te navigeren: Developer –> ADC Reference Library –> index.html

    Vergelijk: handleding Currency Converter met de ADC Reference Libary en met Developer.apple.com;)

    edit: links werken niet, maar wel met rechtermuisknop –> Open koppeling in nieuw venster

9 berichten aan het bekijken - 1 tot 9 (van in totaal 9)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.