2009-06-14 5 views
0

J'ai créé une sous-classe de NSOutlineView et utilisé le code ci-dessous pour alterner les couleurs des lignes.NSOutlineView ne fait pas ce qu'il doit faire dans sa sous-classe

Fichier d'en-tête.

#import <Cocoa/Cocoa.h> 


@interface MyOutlineView : NSOutlineView { 
} 

- (void) drawStripesInRect:(NSRect)clipRect; 

@end 

fichier de mise en œuvre.

#import "MyOutlineView.h" 

// RGB values for stripe color (light blue) 
#define STRIPE_RED (237.0/255.0) 
#define STRIPE_GREEN (243.0/255.0) 
#define STRIPE_BLUE (254.0/255.0) 
static NSColor *sStripeColor = nil; 

@implementation MyOutlineView 

// This is called after the table background is filled in, 
// but before the cell contents are drawn. 
// We override it so we can do our own light-blue row stripes a la iTunes. 
- (void) highlightSelectionInClipRect:(NSRect)rect { 
    [self drawStripesInRect:rect]; 
    [super highlightSelectionInClipRect:rect]; 
} 

// This routine does the actual blue stripe drawing, 
// filling in every other row of the table with a blue background 
// so you can follow the rows easier with your eyes. 
- (void) drawStripesInRect:(NSRect)clipRect { 
    NSRect stripeRect; 
    float fullRowHeight = [self rowHeight] + [self intercellSpacing].height; 
    float clipBottom = NSMaxY(clipRect); 
    int firstStripe = clipRect.origin.y/fullRowHeight; 
    if (firstStripe % 2 == 0) 
     firstStripe++; // we're only interested in drawing the stripes 
    // set up first rect 
    stripeRect.origin.x = clipRect.origin.x; 
    stripeRect.origin.y = firstStripe * fullRowHeight; 
    stripeRect.size.width = clipRect.size.width; 
    stripeRect.size.height = fullRowHeight; 
    // set the color 
    if (sStripeColor == nil) 
     sStripeColor = [[NSColor colorWithCalibratedRed:STRIPE_RED 
                green:STRIPE_GREEN 
                blue:STRIPE_BLUE 
                alpha:1.0] retain]; 
    [sStripeColor set]; 
    // and draw the stripes 
    while (stripeRect.origin.y < clipBottom) { 
     NSRectFill(stripeRect); 
     stripeRect.origin.y += fullRowHeight * 2.0; 
    } 
} 

@end 

Mais le problème est que ce que le code est censé faire ne pas arriver à la vue Plan, le code est correct, mais dois-je connecter la vue Outline au code est d'une certaine façon?

Répondre

4

Si vous instanciez l'affichage hiérarchique dans IB, vous devez définir le nom de classe de votre vue hiérarchique sur "MyOutlineView" dans l'inspecteur d'identité. N'oubliez pas de double-cliquer sur le contrôle pour que le rectangle intérieur soit sélectionné et que le titre de la fenêtre Inspecteur soit "Identité de la vue générale"; un simple clic sur le contrôle sélectionne uniquement la vue déroulante (une vue générale est intégrée dans une vue déroulante).

Si vous créez votre vue contour programme, juste être sûr de instancier un MyOutlineView au lieu d'un NSOutlineView:

MyOutlineView *outlineView = [[MyOutlineView alloc] initWithFrame:rect]; 

rect est le cadre de votre point de vue de contour.

+0

Parfait! Tu es incroyable! Je me demandais si vous pouviez m'aider avec une dernière chose, comment je pourrais faire la ligne de la grille de couleur jaune au lieu de bleu. Je sais que je devrais changer les chiffres là où il est dit définir, mais de quoi aurais-je besoin pour le changer? Merci beaucoup! – Joshua

+0

STRIPE_RED, STRIPE_GREEN et STRIPE_BLUE sont les valeurs RVB des couleurs. Si vous trouvez les valeurs RVB du jaune que vous voulez, changez ces définitions en conséquence, en gardant le /255.0 car elles sont évidemment représentées comme une décimale entre 0 et 1. –

Questions connexes