Anfängerfrage: Wie wird ein Custom View richtig eingesetzt?

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

Macoun 2019 - Frühbucherrabatt endet morgen

  • Mac & i Test Abo
  • @MyMattes:
    In initWithFrame wird der drawPath initialisiert und in drawRect später benutzt. Und ja, es funktioniert!!!

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame
    2. {
    3. self = [super initWithFrame:frame];
    4. if (self) {
    5. // Initialization code here.
    6. i = 0;
    7. myDrawRect = [self bounds];
    8. CGFloat dxr = 30.5;
    9. CGFloat dyu = 20.5;
    10. CGFloat dxl = 30.5;
    11. CGFloat dyo = 5.5;
    12. pul.x = myDrawRect.origin.x+dxl;
    13. pul.y = myDrawRect.origin.y+dyu;
    14. pur.x = pul.x+myDrawRect.size.width-dxl-dxr;
    15. pur.y = pul.y;
    16. pol.x = pul.x;
    17. pol.y = pul.y+myDrawRect.size.height-dyu-dyo;
    18. por.x = pur.x;
    19. por.y = pol.y;
    20. drawPath = [[NSBezierPath alloc] init];
    21. //drawPath = [NSBezierPath bezierPath];
    22. [drawPath moveToPoint: pur];
    23. [drawPath lineToPoint: pul];
    24. [drawPath moveToPoint: NSMakePoint(pul.x, pul.y-4)];
    25. [drawPath lineToPoint: pol];
    26. [drawPath lineToPoint: por];
    27. [drawPath lineToPoint: pur];
    28. [drawPath lineToPoint: NSMakePoint(pur.x, pur.y-4)];
    29. [drawPath setLineWidth:1.0];
    30. }
    31. return self;
    32. }
    Alles anzeigen
  • 1) Das hier funktioniert nicht:

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame
    2. {
    3. self = [super initWithFrame:frame];
    4. if (self) {
    5. // Initialization code here.
    6. // ...
    7. drawPath = [NSBezierPath bezierPath]; // ...
    8. }
    9. return self;
    10. }


    2) Das hier funktioniert:

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame
    2. {
    3. self = [super initWithFrame:frame];
    4. if (self) {
    5. // Initialization code here.
    6. // ...
    7. drawPath = [[NSBezierPath alloc] init];
    8. // ...
    9. }
    10. return self;
    11. }
    Alles anzeigen

    3) Und das hier funktioniert auch:

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame{
    2. self = [super initWithFrame:frame];
    3. if (self) {
    4. // Initialization code here.
    5. // ...
    6. drawPath = [NSBezierPath bezierPath];
    7. [drawPath retain]; // ... }
    8. return self;
    9. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von LarsKrachen ()

  • LarsKrachen schrieb:

    In initWithFrame wird der drawPath initialisiert und in drawRect später benutzt. Und ja, es funktioniert!!!

    Aaahhh, so langsam dämmert es mir, glaube ich :)

    Kann es sein, dass im genannten Fall nur eine Custom View archiviert und somit beim Wiederherstellen eben das initWithCoder: von NSCustomView aufgerufen wird? Erst diese instanziert dann die eigentliche View mit dem entsprechenden initWithCoder: (und führt so auch Lars' Code aus) ...

    Kann mir das eine(r) von Euch Cracks bestätigen? Dann würde mein Weltbild wieder stimmen ... Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • LarsKrachen schrieb:

    1) Das hier funktioniert nicht:

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame
    2. {
    3. self = [super initWithFrame:frame];
    4. if (self) {
    5. // Initialization code here.
    6. // ...
    7. drawPath = [NSBezierPath bezierPath]; // ...
    8. }
    9. return self;
    10. }


    2) Das hier funktioniert:

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame
    2. {
    3. self = [super initWithFrame:frame];
    4. if (self) {
    5. // Initialization code here.
    6. // ...
    7. drawPath = [[NSBezierPath alloc] init];
    8. // ...
    9. }
    10. return self;
    11. }
    Alles anzeigen

    3) Und das hier funktioniert auch:

    Quellcode

    1. - (id)initWithFrame:(NSRect)frame{
    2. self = [super initWithFrame:frame];
    3. if (self) {
    4. // Initialization code here.
    5. // ...
    6. drawPath = [NSBezierPath bezierPath];
    7. [drawPath retain]; // ... }
    8. return self;
    9. }
    Natürlich funktioniert das so, ließ doch bitte mal was einführendes. Da gehts um das Speichermanagement.
    Version 1 geht nicht, weil nach dem Verlassen der Methode, Dein Objekt wieder weg ist.
  • LarsKrachen schrieb:

    MyMattes schrieb:

    LarsKrachen schrieb:

    1) Das hier funktioniert nicht:

    Stichwort zum Selbststudium: "Memory Management" AKA "Speicherverwaltung" ... einfach mal ein paar Tage zurück Deinen eigenen Thread lesen.

    Genervt, Mattes
    So langsam fang ich an zu verstehen !!! Ich hoffe, das der Schritt zur richtigen Anwendung nicht mehr so groß ist !!! :thumbsup:
    Kommt drauf an, ob Du das beherzigst, was Dir andere sagen, fang mit den Basics an.
  • MyMattes schrieb:

    Kann es sein, dass im genannten Fall nur eine Custom View archiviert und somit beim Wiederherstellen eben das initWithCoder: von NSCustomView aufgerufen wird? Erst diese instanziert dann die eigentliche View mit dem entsprechenden initWithCoder: (und führt so auch Lars' Code aus) ...

    Kann mir das eine(r) von Euch Cracks bestätigen? Dann würde mein Weltbild wieder stimmen ... Mattes

    Das kann ich Dir bestätigen. Ich kann Dir sogar sagen, wo Apple das beschreibt.

    Michael