NSTextfield und Inlineobjekt

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

  • NSTextfield und Inlineobjekt

    Hi, ich bin hier neu im Forum. Ich arbeite seit einiger Zeit an einem kleinen Mac Software-Projekt und hab ein Problem, bei dem ich einfach nicht weiter komme:
    Ich habe auf einem View ein NSTextfield, in dem Rechts (ähnlich wie z.B. der Refresh-Button in der URL-Zeile von Safari oder dem Clear-Button in einem Suchfeld) ein NSButton platziert werden soll, der ein Kontextmenü öffnet. Ich möchte auch gerne, dass der Button aus designtechnischen Gründen dort bleibt.
    Mein Problem ist jetzt nur, dass ich keinen Weg gefunden habe, um das Textfield dazu zu bringen, dass der Text bei editieren rechtzeitig weitergeschoben wird, so dass der Cursor niemals hinter den Button kommt; also sozusagen dass man den maximalen Inhalt des Textfields festlegen kann, bevor es weiterscrollt (was normalerweise ja erst passiert, wenn der rechte Rand erreicht wird).
    Ich habe bis jetzt nichts dazu gefunden, wie man mit solchen 'inline' Objekten umgeht.

    Schonmal danke für eure Hilfe.
    512k
  • Eine Möglichkeit wäre, Dir eine custom NSTextFieldCell zu basteln und da dann - (void)editWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent zu überschreiben. Musst dann die Breite vom Button abziehen, vermutlich auch - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView überschreiben. Diese cell setzt Du dann - im Code oder im IB - in Deinem NSTextField.

    Am besten Du erstellst in der custom cell eine Methode, die Dir das textrect zurückgibt:

    Quellcode

    1. - (NSRect)textRectForFrame:(NSRect)aFrame
    2. {
    3. NRect newFrame = aFrame;
    4. CGFloat newWidth -= myButtonSize.width + Padding;
    5. newFrame.size.widh = ( newWidth < minimumAllowedSize ) ? minimumAllowedSize : newWidth;
    6. return newFrame;
    7. }

    in -editWithFrame und -drawInteriorWithFrame rufst Du dann diese Methode mit dem frame-Parameter auf.

    Gruß, Markus
  • Danke Markus. Ich hatte aus verschiedenen Gründen erst jetzt Zeit die Möglichkeit mit der Customcell auszuprobieren. Ich denke auch, dass das die einfachste Möglichkeit ist das Problem zu lösen aber ich bin mir bei der Umsetzung nicht ganz sicher. Ich habe in meine CustomTextfieldcell Klasse eine Methode angelegt, die so aussieht:

    Quellcode

    1. - (NSRect)textRectForFrame:(NSRect)aFrame{
    2. NSRect newFrame = aFrame;
    3. CGFloat newWidth = 350;
    4. newFrame.size.width = newWidth;
    5. return newFrame;
    6. }


    Diese Methode rufe ich dann in -(void)editWithFrame:(NSRect)aRect inView:(NSView*)controlView editor:(NSText*)textObj delegate:(id)anObject event:(NSEvent*)theEvent und - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView mit [self textrectforframe:nil]; auf. Leider endet das ganze dann immer in ECX_BAD_ACCESS. Ich weiß leider gerade nicht ganz genau, was das Problem ist bzw. was ich machen muss, um zum gewünschten Ergebnis zu kommen.

    512K