Проблемы, возникающие при настройке NSTextFieldCell

Я пытаюсь сделать ячейки в виде контура так же, как у нас для пользователей в окне сообщений Skype.

  1. Для этого я создал собственный класс:

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 ответ

  1. Приложение часто падает, когда я выбираю одну или другую строку в виде структуры.

Пожалуйста, отредактируйте ваш вопрос, чтобы включить журнал сбоя.

2. Для журнала: NSLog(@"userImageName - %@ / cellText- %@",userImageName,cellText); Я получаю (null) как userImageName, хотя я должен получить некоторое строковое значение для него.

Вы установили имя изображения с помощью setName: или получил его от imageNamed:? В противном случае он не имеет, и этот вывод является правильным.

Другие вопросы по тегам