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
- 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