Waarom ontvangt mijn aangepaste deelnemersmethode de oproep niet?

Ik wil het bericht verzenden vanuit HelloWorldLayer en het ontvangen in ScoreLayer om het label bij te werken. De CCLOG (@ "/// addNewScore"); werkt goed, maar dan updateScore , in ScoreLayer, ontvangt de oproep niet, zou je weten waarom? Hier is mijn code: (bewerking: ik heb geprobeerd met "behouden" in @property, maar er verandert niets):

@interface HelloWorldLayer : CCLayer
{
    //...
    iddelegate;
}

@property (nonatomic,retain) id  delegate;


@implementation HelloWorldLayer
@synthesize delegate;
//...
-(void)addNewScore:(int)num{
    CCLOG(@"///addNewScore");//works fine
    [delegate updateScore:num];
}


#import 

@protocol ScoreDelegate
-(void)updateScore:(int)num;
@end

@interface ScoreLayer : CCLayer {
    //...
}

-(void)updateScore:(int)num{
    CCLOG(@"hello");//DOES NOT WORK
}

@end

Hartelijk bedankt

0
@mttrb: sorry mttrb wat bedoel je? alle code over de afgevaardigde staat erboven, mis ik iets?
toegevoegd de auteur Paul, de bron
Ter verduidelijking: de code waarnaar we op zoek zijn, ziet er als volgt uit: anHelloWorldLayer.delegate = aScoreLayer , samen met de context, zoals waar dit zich in uw code voordoet.
toegevoegd de auteur Chris Trahey, de bron
U hebt niet aangetoond waar u de eigenschap gedelegeerde van HelloWorldLayer instelt. Ik neem aan dat je dit ergens doet?
toegevoegd de auteur mttrb, de bron

2 antwoord

Ik vermoed dat de ScoreLayer wordt vrijgegeven voordat je belt. Ik ben niet zo bekend met assign , ik heb alleen ARCobjective-cgeschreven; maar ik denk dat het ruwweg hetzelfde is als zwak (zoals het zou moeten zijn voor afgevaardigden). Dit betekent dat om ervoor te zorgen dat die aanwijzer geldig is, iemand anders in de applicatie de Scorelaag moet "bezitten".

Nu, dat gezegd hebbende, ik heb alleen aangenomen dat je de twee objecten op de juiste manier verbindt. Er is geen code geplaatst waaruit blijkt dat, maar deze kwestie van een eventueel uitgebrachte ScoreLayer is belangrijk genoeg om op beide manieren in gedachten te houden.

2
toegevoegd
bedankt ctrahey, ik heb geprobeerd met @property (nonatomic, retain) , maar geen verandering. De afgevaardigde zorgt voor het behoud, nietwaar?
toegevoegd de auteur Paul, de bron
oeps je hebt gelijk, het werkt nu! bedankt! mag ik je nog een laatste vraag stellen? om bijvoorbeeld de score van 100 tot 500 bij te werken, zou ik de getallen tussen 100 en 500 willen laten zien, zodat het niet direct van 100 naar 500 gaat, maar 101, 102 ... 499.500 heel snel. Maar dit blokkeert de ui een halve seconde, of meer. Zou je alleen een dispatchQue gebruiken? heel erg bedankt voor je antwoord!
toegevoegd de auteur Paul, de bron
Hallo @ Hexark, naar welke puzzel verwijs ik?
toegevoegd de auteur Chris Trahey, de bron
Dezelfde basisvraag, maar als je geen oplossing kunt vinden op basis van wat hier is ... ;-)
toegevoegd de auteur Chris Trahey, de bron
Als het algemene advies hier niet naar de oplossing leidt, open dan een nieuwe SO-vraag en plaats uw werkelijke code zodat we het specifieke verschil kunnen evalueren :-)
toegevoegd de auteur Chris Trahey, de bron
2 dingen: zorg ervoor dat de deelnemer wordt vastgehouden door iemand (meestal niet jij, wees voorzichtig dat geen enkele "kinderen" als afgevaardigden naar hun "ouders" verwijst), en de meest waarschijnlijke oplossing: stap door je code en maak zeker dat u uw gedelegeerde feitelijk ergens aan toewijst (en dat waar u aan toewijst, u niet per ongeluk nul toekent).
toegevoegd de auteur Chris Trahey, de bron
Dat is een geweldige vraag voor de SO-gemeenschap in het algemeen! Ik heb ideeën, maar anderen zullen het zeker leuk vinden om mee te doen. Bedankt!
toegevoegd de auteur Chris Trahey, de bron
Er is nergens in uw code waar ik veel kan achterhalen over hoe de ScoreLayer wordt behandeld. Op basis van je reactie op @mttrb hierboven, lijkt het alsof je een cruciaal stukje van de puzzel mist: niets is in feite een scoreLayer geven aan een HelloWorldLayer.
toegevoegd de auteur Chris Trahey, de bron
if (delegate) {[delegate delegateMethod]} De gemachtigde is nul. Ik doe precies hetzelfde in een andere klas, het werkt. Maar in deze klasse doet het dat niet. Ik heb geen idee waarom ..
toegevoegd de auteur Hexark, de bron
Hallo zou je het erg vinden om de oplossing voor deze puzzel te vinden?
toegevoegd de auteur Hexark, de bron
Ik heb 2 klassen. Eén klasse A doet veel berekeningen en de andere klasse is B geeft alle details weer. Ik gebruik gedelegeerde uit klasse A om gegevens naar klasse B te verzenden om gegevens weer te geven. Klasse B heeft een knop waarmee ik een gedelegeerde methode wil activeren wanneer ik erop druk. Terwijl klasse A gegevens naar B verzenden, werkt foutloos, klasse B naar A niet. Is dit wat je bedoelt met kinderen 'naar hun' ouders wijzen? Zo ja, welke oplossing is er?
toegevoegd de auteur Hexark, de bron
OK Sorry. Ik dacht omdat ze dezelfde vraag waren. Bedankt! :)
toegevoegd de auteur Hexark, de bron

U zou dat protocol (gedelegeerde methode) in het interfacebestand van HelloWorldLayer declareren. U plaatst de gedelegeerde methode dan in ScoreLayer.m :

-(void)updateScore:(int)num {
   //Do something
}

Zoals het nu is, heb je het protocol in de verkeerde klas verklaard.

2
toegevoegd
Ik denk niet dat de verklaring per se op de verkeerde plaats is. Over het algemeen moeten klassen die een protocol implementeren meer weten dan klassen die het gebruiken in handtekeningen van methoden. Voor de laatste moeten we echt vooruit verklaringen gebruiken in de headers en importeren in de implementatiebestanden. Waar een protocol eigenlijk kan worden gedefinieerd, kan zeer subjectief zijn, maar het hoeft niet zo dicht bij een consument van het protocol te staan.
toegevoegd de auteur Chris Trahey, de bron
En hoe dan ook, dit heeft niets te maken met de reden waarom de afgevaardigde de boodschap niet ontvangt.
toegevoegd de auteur Vervious, de bron