(im)mutable array?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • (im)mutable array?

    Hallo,

    beim Projekt GridView tritt folgende Warnmeldung beim Building auf: 'GridView' may not respond to '-setBezierPathsCache'.
    Im Programm selber wird außer dem Dezizollpapier nix angezeigt (d.h. kein Kreis auf dem Papier, der oben links natürlich schon).

    Meine Vermutung wäre ja, dass das Problem auf den Seiten 262 und 267/268 liegt:

    Zunächst wird die Methode -setBezierPathsCache mit Parameter der Klasse NSArray erschaffen, in den Methoden -reloadDataAtIndexes und -reloadData wird aber dann jeweils ein NSMutableArray an sie übergeben.

    Nur, in den Downloaddateien ist der Quelltext für GridView bei den genannten Methoden der gleiche und dort funktionierts. Muss ich irgendwo noch was anderes einstellen oder liegt das Problem ganz wo anders?

    Schon mal Danke für eure Hilfe :D
    qju
    http://www.qju.de.vu
  • RE: (im)mutable array?

    Ach so – Danke für die Erklärung ;)
    FileMerge hatte ich schon "zufällig" gefunden und auch bereits einen Vergleich von den beiden "GridView.m"-Dateien gemacht (meine & und die Download-Variante).
    Es findet (leider?) keine inhaltlichen Fehler...
    Nur z.B., dass bei der Downloadvarianten bei den Settern als Parameterbezeichnung immer "value" verwendet wurde, aber daran wird's ja wohl wirklich nicht liegen...

    Aber was ist denn dann bloß falsch? :(
    http://www.qju.de.vu
  • RE: (im)mutable array?

    Original von Tom9811
    Adlerauge!

    Danke.
    Im Buch heißt es in der Tat reload*.Eigentlich hätte das beim Diff auffallen müssen, wenn der OP es so wie hier eingegeben hat.

    Das wunderte mich auch. Vielleicht erklärt man 'FileMerge' erstmal anhand identischer Dateien (Vielleicht steht es ja schon in einem Buch.), bevor man Unterschiede sucht. FM ist sehr rigorors.
    I would be embarrassed if they did not spy on me.
  • Vielen Dank an longW das Adlerauge und Tom9811 für eure Tipps!!
    "Leider" war das mit dem dem reload* bloß ein Tippfehler hier im Forenbeitrag, im Code heißt es beide Male richtig... (hab's oben auch korrigiert für spätere Leser).

    Die Fehlermeldung tritt ja auch nicht bei der "Titelzeile" (oder wie sie auch immer heißen mag) der reload* Methoden auf, sondern in den beiden reload* Methoden drin jeweils an den Stellen, wo die Methode setBezierPathsCache aufgerufen wird (einmal in jeder reload* Methode zum Vorbereiten bzw. Setzen des Cache):

    Quellcode

    1. [self setBezierPathsCache:paths];

    Einmal tritt der Fehler auch bei bezierPathsCache auf (in reloadDataAtIndex):

    Quellcode

    1. paths = [NSMutableArray arrayWithArray:[self bezierPathsCache]];

    Bei diesen drei Stellen heißt es dann links der Zeile: 'GridView' may not respond to '-setBezierPathsCache' bzw. ... to '-bezierPathsCache'.

    ...already some ideas?
    qju
    http://www.qju.de.vu
  • Ja, war was ganz Dämliches – so wie longW vermutet hat: ich habs' im Header nicht deklariert :rolleyes:

    Gut, ich hätte es wahrscheinlich selber merken sollen/können (bzw. warum kann sich die Fehlermeldung nicht eindeutiger äußern?!), aber auf S. 262 steht auch bloß, man soll den Code nach dem letzten Accessor schreiben – kein Hinweis auf den Header, wo nachher die Deklaration benötigt wird. (Nur so als kleiner Tipp zur Ergänzung an Tom9811.)

    Also alle Warn- und Fehlermeldungen weg, nur ist immer noch kein Kreis dann zu sehen... aber den Fehler find ich (hoffentlich!) noch...

    Schöne Grüße,
    qju
    http://www.qju.de.vu
  • Original von Tom9811
    ---

    ?

    Im Buch ist das ein Selector für einen Button.

    Ähm, wir reden jetzt aber schon über das gleiche Thema, oder? Wo hab ich den Selector und den Buttons übersehen?

    Da benötigst du das nicht im Header.

    Aber damit hat's jetzt doch geklappt: und außerdem ist es in deinen eigenen Beispieldateien auch so...
    http://www.qju.de.vu
  • Sorry, ich war gerade bei -receiveZoomLevelFrom:. Gedankensprung.

    -setBezierPathsCache ist doch eine interne Methode? Dazu muss sie nicht im Header stehen. Ich kann auuch nicht sehen, dass dies beim Download so sei:

    Quellcode

    1. @protocol GridViewDataSource;
    2. @interface GridView : NSView
    3. {
    4. NSValue* _borderSize;
    5. NSValue* _gridSize;
    6. NSValue* _bigGridSize;
    7. NSBezierPath* _selectedPath;
    8. NSArray* _bezierPathCache;
    9. id<GridViewDataSource> dataSource;
    10. }
    11. #pragma mark -
    12. #pragma mark Data-Source
    13. - (id<GridViewDataSource>)dataSource;
    14. - (void)setDataSource:(id<GridViewDataSource>)dataSource;
    15. #pragma mark -
    16. #pragma mark Refreshing
    17. - (void)reloadData;
    18. - (void)reloadDataAtIndexes:(NSIndexSet*)indexes;
    19. @end
    20. #pragma mark -
    21. #pragma mark Data-Source-Protokoll
    22. @protocol GridViewDataSource
    23. - (int)numberOfSymbolsInGridView:(GridView*)gridView;
    24. - (NSBezierPath*)symbolAtIndex:(int)index inGridView:(GridView*)gridView;
    25. @end
    Alles anzeigen
    Es reicht aus, dass du die weiteren Methoden, die das benutzen, in der Source danach folgen. Daher solltest du es ja auch nach den Accessoren (also -setBezierPathsCache:) eingefügt werden.

    Ich kann ehrlich gesagt deine Problemdarstellung nicht nachvollziehen.

    Ich kann auch nicht nachvollziehen, wie das beim Filemerge durchgegangen sein soll.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Oooookay, ich geb's ja zu: die benutzten Methodne standen bei mir natürlich nicht oberhalb im Source... und mit der Headerdeklarartion hab ich das Problem wohl bloß scheinbar gelöst geahabt. – Also vielen Dank für die Aufklärung! Bin ja auch erst beim Lernen von ObjC & Cocoa...

    Aber wenn wir schon mal bei diesem Projekt sind (und du von meiner ewigen Fragerei noch nicht völlig genervt bist :tongue:): Wo wird eigentlich von GriedView.m aus die DataSource zum ersten Mal aufgerufen? (also -init und -awakeFromNib ausgeführt) Bei mir tut sich wohl an dieser Stelle nix (deshalb wird scheinbar auch kein Kreis gemalt).
    http://www.qju.de.vu
  • Gibt es irgendeine Sache, an die man denken muss, damit beim Start des Programmes die -awakeFromNib Methode von DataSource ausgeführt wird? Weder diese noch -init rühren sich nämlich – hab ich per NSLog-Befehl in diesen Methoden geprüft, es gibt also keine Ausgabe im Log diesbezüglich.
    Auch der Austausch von den Dateien DataSource.m und *.h mit den Downloaddateien hilft nix...
    http://www.qju.de.vu