Accessing View in awakeFromNib?

前端 未结 5 601
醉话见心
醉话见心 2020-12-08 08:48

I have been trying to set a UIImageView background color (see below) in awakeFromNib

[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alp         


        
5条回答
  •  时光说笑
    2020-12-08 09:26

    I know, this post is a bit older, but I recently had a similar problem and would like to share its solution with you.

    Having subclassed NSTextView, I wanted to display the row colors in alternating orders. To be able to alter the colors from outside, I added two instance vars to my subclass, XNSStripedTableView:

    @interface XNSStripedTableView : NSTableView {
    
        NSColor *pColor; // primary color
        NSColor *sColor; // secondary color
    }
    
    @property (nonatomic, assign) NSColor *pColor;
    @property (nonatomic, assign) NSColor *sColor;
    
    @end
    

    Overwriting highlightSelectionInClipRect: does the trick to set the correct color for the respective clipRect.

    - (void)highlightSelectionInClipRect:(NSRect)clipRect
    

    {

    float rowHeight = [self rowHeight] + [self intercellSpacing].height;
    NSRect visibleRect = [self visibleRect];
    NSRect highlightRect;
    
    highlightRect.origin = NSMakePoint(NSMinX(visibleRect), (int)(NSMinY(clipRect)/rowHeight)*rowHeight);
    highlightRect.size = NSMakeSize(NSWidth(visibleRect), rowHeight - [self intercellSpacing].height);
    
    while (NSMinY(highlightRect) < NSMaxY(clipRect)) {
    
        NSRect clippedHighlightRect = NSIntersectionRect(highlightRect, clipRect);
        int row = (int) ((NSMinY(highlightRect)+rowHeight/2.0)/rowHeight);
        NSColor *rowColor = (0 == row % 2) ? sColor : pColor;
        [rowColor set];
        NSRectFill(clippedHighlightRect);
        highlightRect.origin.y += rowHeight;
    }
    
    [super highlightSelectionInClipRect: clipRect];
    

    }

    The only problem now is, where to set the initial values for pColor and sColor? I tried awakeFromNib:, but this would cause the debugger to come up with an error. So I dug into the problem with NSLog: and found an easy but viable solution: setting the initial values in viewWillDraw:. As the objects are not created calling the method the first time, I had to check for nil.

    - (void)viewWillDraw {
    
    if ( pColor == nil ) 
        pColor = [[NSColor colorWithSRGBRed:0.33 green:0.33 blue:0 alpha:1] retain];
    
    if ( sColor == nil ) 
        sColor = [[NSColor colorWithSRGBRed:0.66 green:0.66 blue:0 alpha:1] retain];
    

    }

    I do think this solution is quite nice :-) although one could reselect the names of pColor and sColor could be adjusted to be more "human readable".

提交回复
热议问题