0

我正在尝试在大纲视图中制作单元格,就像我们在 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

2,我为大纲视图分配了文本字段单元格:IB中的IconNameCell

第三,我在委托中使用此代码在自定义单元格中设置图像、图标和用户名称-

 - (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,虽然我应该得到一些字符串值。

谁能建议我一些解决方案?

谢谢,

米拉杰

4

1 回答 1

1
  1. 当我在大纲视图中选择一行或另一行时,应用程序经常崩溃。

请编辑您的问题以包含崩溃日志。

2.对于日志:NSLog(@"userImageName - %@ / cellText- %@",userImageName,cellText); 我得到 (null) 作为 userImageName,虽然我应该得到一些字符串值。

您是否设置了图像的名称setName:或从 获得它imageNamed:?否则,它没有一个,这个输出是正确的。

于 2010-02-01T11:39:33.530 回答