首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在awakeFromNib中访问视图?

在awakeFromNib中访问视图?
EN

Stack Overflow用户
提问于 2010-04-27 16:31:51
回答 5查看 13.2K关注 0票数 12

我一直试图在UIImageView中设置awakeFromNib背景色(见下文)

代码语言:javascript
复制
[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];

当它不起作用时,我意识到这可能是因为视图还没有加载,我应该将颜色更改移到viewDidLoad。

我能证实一下我有这个权利吗?

加里

EDIT_002:

我刚刚开始了一个新的项目来检查这个从一个干净的开始。我和往常一样设置视图。结果是,在awakeFromNib中,控件确实被设置为(null)。以下是我所拥有的:

代码:

代码语言:javascript
复制
@interface iPhone_TEST_AwakeFromNibViewController : UIViewController {
    UILabel *myLabel;
    UIImageView *myView;
}
@property(nonatomic, retain)IBOutlet UILabel *myLabel;
@property(nonatomic, retain)IBOutlet UIImageView *myView;
@end

代码语言:javascript
复制
@synthesize myLabel;
@synthesize myView;

-(void)awakeFromNib {
    NSLog(@"awakeFromNib ...");
    NSLog(@"myLabel: %@", [myLabel class]);
    NSLog(@"myView : %@", [myView class]);
    //[myLabel setText:@"AWAKE"];
    [super awakeFromNib];

}

-(void)viewDidLoad {
    NSLog(@"viewDidLoad ...");
    NSLog(@"myLabel: %@", [myLabel class]);
    NSLog(@"myView : %@", [myView class]);
    //[myLabel setText:@"VIEW"];
    [super viewDidLoad];
}

产出:

代码语言:javascript
复制
awakeFromNib ...
myLabel: (null)
myView : (null)
viewDidLoad ...
myLabel: UILabel
myLabel: UIImageView

我很想知道这是否应该起作用,从文档看,它看起来应该起作用,但考虑到我通常的设置方式,我不太明白为什么在这种情况下它不起作用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-28 16:49:46

还有一个答案是:-)看起来你得到了这种行为,因为控制器加载视图很懒散。视图不会立即加载,当有人第一次调用view访问器时,它就会被加载。因此,在您收到awakeFromNib时,NIB加载过程已经完成,但不是针对视图中的对象。请参阅以下代码:

代码语言:javascript
复制
@property(retain) IBOutlet UILabel *foo;
@synthesize foo;

- (void) awakeFromNib
{
    NSLog(@"#1: %i", !!foo);
    [super awakeFromNib];
    NSLog(@"#2: %i", !!foo);
}

- (void) viewDidLoad
{
    NSLog(@"#3: %i", !!foo);
}

这个日志:

代码语言:javascript
复制
#1: 0
#2: 0
#3: 1

但如果你强行加载视图:

代码语言:javascript
复制
- (void) awakeFromNib
{
    NSLog(@"#1: %i", !!foo);
    [super awakeFromNib];
    [self view]; // forces view load
    NSLog(@"#2: %i", !!foo);
}

日志将更改为:

代码语言:javascript
复制
#1: 0
#3: 1
#2: 1
票数 31
EN

Stack Overflow用户

发布于 2010-04-27 18:00:30

我相信您对超级的调用需要是awakeFromNib方法中的第一行,否则元素还不会被设置。

代码语言:javascript
复制
-(void)awakeFromNib {
  [super awakeFromNib];
  [imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];
  [testLabel setText:@"Pants ..."];  
}
票数 1
EN

Stack Overflow用户

发布于 2012-02-15 11:09:08

我知道,这篇文章有点老了,但我最近遇到了一个类似的问题,想和大家分享一下它的解决方案。

子类NSTextView之后,我想以交替的顺序显示行的颜色。为了能够从外部更改颜色,我在子类XNSStripedTableView中添加了两个实例vars:

代码语言:javascript
复制
@interface XNSStripedTableView : NSTableView {

    NSColor *pColor; // primary color
    NSColor *sColor; // secondary color
}

@property (nonatomic, assign) NSColor *pColor;
@property (nonatomic, assign) NSColor *sColor;

@end

覆盖highlightSelectionInClipRect:为相应的clipRect设置正确的颜色。

代码语言:javascript
复制
- (void)highlightSelectionInClipRect:(NSRect)clipRect

{

代码语言:javascript
复制
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];

}

现在唯一的问题是,在哪里设置pColor和sColor的初始值?我尝试了awakeFromNib:,但是这会导致调试器产生一个错误。因此,我深入研究了NSLog:的问题,并找到了一个简单但可行的解决方案:在NSLog中设置初始值由于第一次没有创建调用该方法的对象,所以我不得不检查nil

代码语言:javascript
复制
- (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];

}

我确实认为这个解决方案非常好:-)尽管我们可以重新选择pColor和sColor的名称,以使它们更加“可读性”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2723042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档