2010-02-01 16 views
0

J'essaie de créer des cellules dans une vue générale, comme nous l'avons fait pour les utilisateurs dans la fenêtre de message de Skype.Problèmes rencontrés lors de la personnalisation de NSTextFieldCell

  1. Pour cela, je crée une classe personnalisée:

IconNameCell.h

@interface IconNameCell : NSTextFieldCell { 
     //@private 
     NSImage *userImage; // size (17,17) 
     NSImage *statusIcon; // size (14,14) 
     NSString *cellText; 

    } 
    @property (readwrite, retain) NSImage *userImage; 
    @property (readwrite, retain) NSImage *statusIcon; 
    @property (readwrite, retain) NSString *cellText; 
    - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; 
    @end 

IconNameCell.m

@implementation IconNameCell 
@synthesize userImage; 
@synthesize statusIcon; 
@synthesize cellText; 


- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView{ 
    @try{ 
    // Inset the cell frame to give everything a little horizontal padding 
    NSRect anInsetRect = NSInsetRect(cellFrame,2.0,0); 

    //FIXME: flip coordinates and size can be set in accessor methods 
    // setting userImage and statusIcon in flipped coordinate 
    [userImage setFlipped:YES]; 
    [statusIcon setFlipped:YES]; 

    // setting size of image and icon 
    [userImage setSize:NSMakeSize(25.0, 25.0)]; 
    [statusIcon setSize:NSMakeSize(15.0, 17.0)]; 

    // setting attributes of cell text 
    NSMutableParagraphStyle *dParagraphStyle = [[NSMutableParagraphStyle alloc] init]; 
    [dParagraphStyle setAlignment:NSLeftTextAlignment]; 

    NSColor *colorOfText; 
    if ([self isHighlighted]) { 
     colorOfText = [NSColor whiteColor]; 
    } 
    else { 
     colorOfText = [NSColor blackColor]; 
    } 

    NSMutableDictionary * dTitleAttributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
               colorOfText,NSForegroundColorAttributeName, 
               [NSFont systemFontOfSize:11.0],NSFontAttributeName, 
               dParagraphStyle, NSParagraphStyleAttributeName, 
               nil]; 

    // getting sizes 
    NSSize cellTextSize = [cellText sizeWithAttributes:dTitleAttributes]; 
    NSSize userImageSize = [userImage size]; 
    NSSize statusIconSize = [statusIcon size]; 

    // making layout boxes for all elements 

    // vertical padding between the lines of text 
    float dVerticalPadding = 2.0; 

    // horizontal padding between two images 
    float padBtwnImgs = 4.0; 

    // horizontal padding between image and text 
    float padBtwnImgText = 6.0; 


     NSString *userImageName = [userImage name]; 
     NSLog(@"userImageName - %@/cellText- %@",userImageName,cellText); // getting null for userImageName 

     //if ([userImageName isEqualToString:@"current_D.png"]) { 


     //FIXME: this is juggad and should be corrected 
     NSRange rangeOfComma = [cellText rangeOfString:@","]; 
     if (rangeOfComma.length !=0) { 
      //<#statements#> 

     // userImage box: center the userImage vertically inside of the inset rect 
     NSRect cellTitleBox = NSMakeRect(anInsetRect.origin.x, 
             anInsetRect.origin.y + anInsetRect.size.height*.5 - cellTextSize.height*.5, 
             cellTextSize.width, 
             cellTextSize.height); 

     // drawing cell text 
     [cellText drawInRect:cellTitleBox withAttributes:dTitleAttributes]; 
    } 
    else { 
     // userImage box: center the userImage vertically inside of the inset rect 
     NSRect userImageBox = NSMakeRect(anInsetRect.origin.x, 
             anInsetRect.origin.y + anInsetRect.size.height*.5 - userImageSize.height*.5, 
             userImageSize.width, 
             userImageSize.height); 

     // statusIcon box: center the statusIcon vertically inside of the inset rect 
     NSRect statusIconBox = NSMakeRect(userImageBox.origin.x + userImageBox.size.width + padBtwnImgs, 
              anInsetRect.origin.y + anInsetRect.size.height*.5 - statusIconSize.height*.5, 
              statusIconSize.width, 
              statusIconSize.height); 

     // cellTitleBox: vertically aligning text 
     NSRect cellTitleBox = NSMakeRect(statusIconBox.origin.x + statusIconBox.size.width + padBtwnImgText, 
             anInsetRect.origin.y + anInsetRect.size.height*.5 - cellTextSize.height*.5, 
             cellTextSize.width, 
             cellTextSize.height); 

     // drawing user image 
     [userImage drawInRect:userImageBox fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 

     // drawing user status 
     [statusIcon drawInRect:statusIconBox fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 

     // drawing cell text 
     [cellText drawInRect:cellTitleBox withAttributes:dTitleAttributes]; 
    } 
    } 
    @catch (NSException *e) { 
     NSLog(@"IconNameCell -%@",e); 
    } 


} 
@end 

2ème, j'affecté la cellule de champ de texte pour une vue de plan la classe: IconNameCell dans IB

3, j'ai utilisé ce code dans délégué pour définir l'image, l'icône et le nom d'utilisateur que je suis personnalisé Cell-

- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item{ 
     if ([[tableColumn identifier] isEqualToString:@"userInfo"]) { 
      // some relevant code 

      if([[item onlineStatus] intValue] == 0){ 
     [cell setStatusIcon:[NSImage imageNamed:@"offline.png"]]; 
     } 
     else{ 
     [cell setStatusIcon:[NSImage imageNamed:@"online.png"]]; 
     } 

     //similarly, setting attribute for userImage and cellText 

     } 

face à deux problèmes: 1. L'application est souvent plantait quand je suis sélectionné un ou l'autre rangée dans la vue d'ensemble. Plus tôt quand je n'avais pas pris la cellule personnalisée, mais trois colonnes différentes pour - l'image de l'utilisateur, le statut de l'utilisateur et le nom d'utilisateur, il fonctionnait bien! 2. Pour le journal: NSLog (@ "userImageName -% @/cellText-% @", userImageName, cellText); Je reçois (null) comme userImageName, bien que je devrais obtenir une certaine valeur de chaîne pour cela.

Quelqu'un peut-il me suggérer une solution pour cela ??

Merci,

Miraaj

Répondre

1
  1. application est souvent plantait quand je suis sélectionné un ou l'autre ligne en mode plan.

Veuillez modifier votre question pour inclure le journal de panne.

2. Pour le journal: NSLog (@ "userImageName -% @/cellText-% @", userImageName, cellText); Je reçois (null) comme userImageName, bien que je devrais obtenir une certaine valeur de chaîne pour cela.

Avez-vous défini le nom de l'image avec setName: ou l'avez-vous obtenu auprès de imageNamed:? Sinon, il n'en a pas, et cette sortie est correcte.