Проблемы, возникающие при настройке NSTextFieldCell
Я пытаюсь сделать ячейки в виде контура так же, как у нас для пользователей в окне сообщений Skype.
- Для этого я создал собственный класс:
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
Во-вторых, я назначил ячейку текстового поля для представления структуры: IconNameCell в IB
В-третьих, я использовал этот код в делегате, чтобы установить изображение, значок и имя пользователя в пользовательской ячейке.
- (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
}
Я сталкиваюсь с двумя проблемами: 1. Часто происходит сбой приложения, когда я выбираю одну или другую строку в виде структуры. Раньше, когда я не брал настраиваемую ячейку, а три разных столбца - изображение пользователя, статус пользователя и имя пользователя, он работал нормально! 2. Для журнала: NSLog(@"userImageName - %@ / cellText- %@",userImageName,cellText); Я получаю (null) как userImageName, хотя я должен получить некоторое строковое значение для него.
Может кто-нибудь предложить мне какое-то решение для этого?
Спасибо,
Miraaj
1 ответ
- Приложение часто падает, когда я выбираю одну или другую строку в виде структуры.
Пожалуйста, отредактируйте ваш вопрос, чтобы включить журнал сбоя.
2. Для журнала: NSLog(@"userImageName - %@ / cellText- %@",userImageName,cellText); Я получаю (null) как userImageName, хотя я должен получить некоторое строковое значение для него.
Вы установили имя изображения с помощью setName:
или получил его от imageNamed:
? В противном случае он не имеет, и этот вывод является правильным.