Iphone 为什么赢了';我是不是被火烧醒了?

Iphone 为什么赢了';我是不是被火烧醒了?,iphone,interface-builder,nib,xib,Iphone,Interface Builder,Nib,Xib,我开始将更多的视图层次结构结构移动到IB 我有一个名为“AlignmentViewController.xib”的nib文件,我在其中设置了视图层次结构,其中AlignmentViewController是文件的所有者。这个很好用 我仍然不清楚的一个方法是awakeFromNib。在AlignmentViewController的以下代码片段中,我添加了单个附加方法awakeFromNib。但是,它不会被调用: - (void)awakeFromNib { NSLog(@"Alignme

我开始将更多的视图层次结构结构移动到IB

我有一个名为“AlignmentViewController.xib”的nib文件,我在其中设置了视图层次结构,其中AlignmentViewController是文件的所有者。这个很好用

我仍然不清楚的一个方法是awakeFromNib。在AlignmentViewController的以下代码片段中,我添加了单个附加方法awakeFromNib。但是,它不会被调用:

- (void)awakeFromNib {

   NSLog(@"AlignmentViewController - awakeFromNib");
   [super awakeFromNib];

}

- (id)initWithChromosomeName:(NSString *)chromosomeName 
               basepairStart:(NSUInteger)basepairStart 
                 basepairEnd:(NSUInteger)basepairEnd {

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil];

    if (nil != self) {


        self.title          = @"Alignment";

        self.chromosomeName = chromosomeName;
        self.basepairStart  = basepairStart;
        self.basepairEnd    = basepairEnd;

        self.wantsFullScreenLayout = YES;

    }

    return self;
}
有人能帮我澄清一下我错过了什么吗

干杯, 道格

更新: 在阅读了一些答案后,我意识到我需要弄清一些非常基本的问题

查看初始化:

- (id)initWithChromosomeName:(NSString *)chromosomeName 
               basepairStart:(NSUInteger)basepairStart 
                 basepairEnd:(NSUInteger)basepairEnd {

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil];

我注意到我正在使用nibName:bundle:间接调用init。这是坏习惯吗?AlignmentViewController.xib文件定义了我的视图层次结构。但我并不是以典型的方式使用initWithNibName:bundle:?有更好的方法吗?

-awakeFromNib
在所有nib对象实例化后发送到从nib实例化的所有对象。所有者不是这些对象之一。它在反序列化nib之前存在,并在加载后连接到nib,因此它不会从nib发送
-awakeFromNib
(当然,除非它由其他nib自身实例化)


这里的一个线索是,
-initFromChromosomePair:basepairStart:basePairRend:
-awakeFromNib
不可能同时被调用。nib加载程序始终调用
-initWithCoder:
-initWithFrame:
-init
(为其发送的规则在中)。您有其他指定的初始值设定项这一事实强烈表明您正在代码中的某个位置手动创建此对象,这意味着此对象不是“从nib唤醒”。

根据您告诉我们的,我相信我知道您的问题所在<当从nib文件反序列化对象时,将调用code>awakeFromNib。这里有一个对象,它是所有者,在加载nib之前存在。因此,
awakeFromNib
将永远不会发送到您的
AlignmentViewController.h


如果您需要在此处执行某些操作,请尝试使用
loadView
。或者在载入笔尖后再做。您想在
awakeFromNib
中做的是什么?

只是添加一个澄清:-awakeFromNib以Cocoa格式发送给文件的所有者,但不是Cocoa Touch

  • 它向nib文件中定义匹配选择器的相应对象发送awakeFromNib消息:
    • 在Mac OS X中,此消息被发送到定义该方法的任何接口对象。它还会发送给文件的所有者以及定义它的任何代理对象
    • 在iPhone操作系统中,此消息仅发送到nib加载代码实例化的接口对象。它不会发送给文件的所有者、第一响应者或任何其他代理对象

您应该重写func awakeFromNib()。 不重写类func awakeFromNib()


FWIW,UIViewController还提供了
viewDidLoad
,专门用于加载视图(无论是手动加载还是从nib加载)后需要在控制器中执行的任何处理。是。我广泛使用viewDidLoad。我只是想把更多的UI构造移到IB上,我需要在某个时候处理awakeFromNib。IB的使用并不要求使用
awakeFromNib
,也不与
viewDidLoad
的使用相矛盾。谢谢Rob,我想我不清楚initWithNibName:bundle:的语义。在我的代码的其他地方,我确实调用了initWithChromosomeName:basepairStart:basepairEnd:它反过来调用initWithNibName:bundle:如上图所示。使用initWithNibName:bundle:时是否不会触发与nib相关的方法;它们只针对nib加载程序实例化的对象。nib的所有者不在nib中,因此不会从nib中醒来-viewDidLoad被发送到视图控制器,在那里您可以完成nib完成加载后需要完成的操作。请注意,视图控制器可以位于nib中,因此可以同时接收-awakeFromNib(当它从父nib加载时)和-viewDidLoad(当它自己的nib完成加载时)-在nib中的所有对象被实例化并连接IBOutlet之后,awakeFromNib被发送到nib中的所有对象。现在我得到了它。谢谢你,罗布,这真的把事情弄清楚了。我忽略了文件所有者只是一个代理,而不是nib的成员这一事实。冷静。非常感谢Rob。很好,我没有意识到FileOwner不会像Nib的视图是自定义类时那样得到这个调用。谢谢Gordon。只是为了更好地理解nib相关代码的语义和时间安排。我越来越依赖IB来构建UI,我仍然不确定IB世界和XCode世界是如何同步的。因此,没有与nib相关的方法会对我使用initWithNibName:bundle:?不,这是因为在您的控制器上没有调用
awakeFromNib
,因为您的控制器不在nib中。它将在nib中的所有视图上调用。请注意,上面Gordon所说的“loadView”,我相信他的意思是“viewDidLoad”。在处理基于nib的视图控制器时,通常不应该弄乱-loadView。Sixten和Rob,非常有帮助。雾正在消散。开悟在即。干杯
override func awakeFromNib() {
    super.awakeFromNib()
    setupContent()
}