- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
根据NSObject UIKit Additions Reference , outlet 变量应该在调用 awakeFromNib
时设置(强调所有我的):
The nib-loading infrastructure sends an awakeFromNib message to each object recreated from a nib archive, but only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet and action connections already established.
...
Important: Because the order in which objects are instantiated from an archive is not guaranteed, your initialization methods should not send messages to other objects in the hierarchy. Messages to other objects can be sent safely from within an awakeFromNib method.
Typically, you implement awakeFromNib for objects that require additional set up that cannot be done at design time. For example, you might use this method to customize the default configuration of any controls to match user preferences or the values in other controls. You might also use it to restore individual controls to some previous state of your application.
但是,这与我的测试不符,至少使用 Storyboard是这样。以下测试的结果似乎与文档相矛盾:
someLabel
的导出到相应的 ViewController 类。awakeFromNib
实现添加到第二个 ViewController:.
- (void) awakeFromNib {
[super awakeFromNib];
if (self.someLabel == nil) {
NSLog(@"someLabel property is nil");
}
else {
NSLog(@"someLabel property is not nil");
}
if (_someLabel == nil) {
NSLog(@"_someLabel is nil");
}
else {
NSLog(@"_someLabel is not nil");
}
}
当我这样做时,我观察到以下记录:
2013-07-01 09:24:35.755 test[498:c07] someLabel property is nil
2013-07-01 09:24:35.758 test[498:c07] _someLabel is nil
由于这种行为,当我需要我的 ViewControllers 有一些涉及它们的 socket 的初始化逻辑时,我需要使用像答案 here 中提出的那样的 hack。为了能够使用网点。如果我正确理解了文档,那么我被迫使用这个 hack 的事实是 UIKit 行为中的一个错误,我应该能够将该初始化放在 awakeFromNib 中
并简单地使用 socket ,没有任何黑客攻击。
不过,我在 Internet 上找不到关于此问题的任何其他提及,考虑到(对我而言)这似乎是一个非常重要的功能,这似乎很奇怪。我也从来没有使用过实际的 nib 文件,只使用过 Storyboard ,所以我对此缺乏一些看法,而且关于这些东西的文档非常冗长和困难,以至于作为 iOS 的新手,我不确定我是否理解正确。这是一个真正的 UIKit 错误,还是我以某种方式误解了文档 - 也许这种方法甚至不打算与 Storyboard结合使用?
最佳答案
您的 View Controller 及其 View 层次结构在运行时从单独的 nib 文件加载。
您的 View Controller 首先加载并接收 awakeFromNib
当它的 nib 被加载时,但是它的 View 层次结构 nib 还没有被加载,所以在 awakeFromNib
您不应该假设已经设置了 View 层次结构的任何导出。
您的 View Controller 收到 viewDidLoad
在它的 View 层次结构 nib 被加载之后,所以在 viewDidLoad
中您可以假设所有导出都已设置。
当 Xcode 构建您的应用程序时,它会编译您的 Storyboard。结果是一个包含 Info.plist
的包(Finder 将其视为文件的文件夹)和一堆 .nib
文件。来 self 的一个项目的示例:
:; pwd
/Users/mayoff/Library/<snip>/Pinner.app/Base.lproj/Main.storyboardc
:; ll
total 80
drwxr-xr-x 10 mayoff staff 340 May 11 22:13 ./
drwxr-xr-x 4 mayoff staff 136 May 11 22:13 ../
-rw-r--r-- 1 mayoff staff 1700 May 11 22:13 AccountCollection.nib
-rw-r--r-- 1 mayoff staff 1110 May 11 22:13 AccountEditor.nib
-rw-r--r-- 1 mayoff staff 2999 May 11 22:13 BYZ-38-t0r-view-8bC-Xf-vdC.nib
-rw-r--r-- 1 mayoff staff 439 May 11 22:13 Info.plist
-rw-r--r-- 1 mayoff staff 7621 May 11 22:13 LqH-9K-CeF-view-OwT-Ts-HoG.nib
-rw-r--r-- 1 mayoff staff 6570 May 11 22:13 OZq-QF-pn5-view-xSR-gK-reL.nib
-rw-r--r-- 1 mayoff staff 2473 May 11 22:13 UINavigationController-ZKB-z3-xgf.nib
-rw-r--r-- 1 mayoff staff 847 May 11 22:13 UIPageViewController-ufv-JN-y6U.nib
Info.plist
将 Storyboard 中的场景名称映射到相应的 Nib :
:; plutil -p Info.plist
{
"UIViewControllerIdentifiersToNibNames" => {
"AccountCollection" => "AccountCollection"
"UINavigationController-ZKB-z3-xgf" => "UINavigationController-ZKB-z3-xgf"
"UIPageViewController-ufv-JN-y6U" => "UIPageViewController-ufv-JN-y6U"
"AccountEditor" => "AccountEditor"
}
"UIStoryboardDesignatedEntryPointIdentifier" => "UINavigationController-ZKB-z3-xgf"
"UIStoryboardVersion" => 1
}
只有当场景具有 Storyboard ID、或连接到它的 segue 或它是初始场景时,它才会显示在此列表中。
Info.plist
中的 nib 文件列表不包含那些 View Controller 的 View 层次结构。每个 nib 文件都包含其场景的 View Controller 和场景中的任何其他顶级对象,但不包含 View Controller 的 View 或其任何 subview 。
一个单独的 nib 文件包含场景的 View 层次结构。从 View Controller 及其顶层 View 的对象 ID 派生的 View 层次结构 nib 的名称。您可以在 Xcode 的“Identity Inspector”中查看 Storyboard中任何对象的对象 ID。例如,我的“AccountCollection”场景的 View Controller ID 是 BYZ-38-t0r
它的 View ID 是 8bC-Xf-vdC
,所以场景的 View 层次结构在文件 BYZ-38-t0r-view-8bC-Xf-vdC.nib
中.场景 nib 文件包含其 View 层次结构 nib 文件的名称:
:; strings - AccountCollection.nib |grep -e '-.*-'
UIPageViewController-ufv-JN-y6U
BYZ-38-t0r-view-8bC-Xf-vdC <---------
UpstreamPlaceholder-5Hn-fK-fqQ
UpstreamPlaceholder-8GL-mk-Rao
q1g-aL-SLo.title
如果一个场景没有 View 层次结构,那么只有一个用于 View Controller 的 nib 文件,而没有单独的用于 View 层次结构的 nib 文件。例如,UIPageViewController
场景在 Storyboard中没有 View 层次结构,因此没有对应于 UIPageViewController-ufv-JN-y6U.nib
的 View 层次结构 Nib .
那么这一切与您的问题有什么关系呢?是这样的:当您的应用从“ Storyboard ”加载场景时,它正在加载包含 View Controller (和其他顶部)的 nib 文件级对象)。当 nib 加载程序完成加载该 nib 文件时,它会发送 awakeFromNib
它刚刚加载的所有对象。这包括您的 View Controller ,但它不包括您的 View ,因为您的 View 不在该 nib 文件中。
稍后,当您的 View Controller 被要求提供其 view
时属性,它加载包含其 View 层次结构的 nib 文件。 View Controller 将自身传递给 -[UINib instantiateWithOwner:options:]
作为owner
争论。这就是 nib 加载器如何将 View 层次结构中的对象连接到 View Controller 的导出和操作。
当 nib 加载器完成加载 View 层次结构 nib 时,它会发送 awakeFromNib
它刚刚加载的所有对象。由于您的 View Controller 不是这些对象之一,因此您的 View Controller 不会收到awakeFromNib
。此时消息。
当 instantiateWithOwner:options:
返回, View Controller 给自己发送 viewDidLoad
信息。这是您更改 View 层次结构的机会。
关于ios - awakeFromNib、导出和 Storyboard : is the documentation wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17400547/
我试图了解 View Controller 的生命周期,但我读到了一些关于 awakeFromNib 的相互矛盾的陈述。文档说所有 socket 都应该在 awakeFromNib 中设置,但是 I
这让我发疯。 我的印象是 awakeFromNib 方法仅被调用一次(即使再次访问该 View ),如果我错了,请纠正我。 我有一个具有 3 个 View 的应用程序。最后一个是 UIview 的子类
是否有 awakeFromNib 的逆向方法,即 Nib 关闭时调用的方法?我知道应用程序委托(delegate)收到应用程序将终止的通知,但想知道是否需要在简单的 NSObject 上保存一些状态信
在我的 RootViewController 中,我有 IBOutlets。我可以通过 viewWillAppear 访问它们,但在 awakeFromNib() 中它们都是 nil 我正在调用sup
希望我不会因为这个而受到指责...... 有人可以解释这是如何将 managedObjectContext 传递给 rootViewController 的吗? 以下是为 iOS 核心数据应用程序自动
我有一个表格 View ,其中注册了两个自定义 Nib 单元。单元及其相应的连接类彼此完全独立。 基于条件的表格 View 应显示注册的两个单元格之一: 表格 View 代码: func tableV
您好,我有一个关于布局的问题。 我使用 Storyboard来设置布局。 而且我已经通过 Storyboard设置了一个 UI 组件。 为了支持iPhone5或iPhone 6 Plus..我正在编写
我一直在学习 coredata,方法是基于选中“使用 coredata”的 xcode 导航 Controller 模板制作许多简单的测试应用程序。 App 委托(delegate)中的 awakeF
awakeFromNib 是否在分配和初始化 viewController 后立即被调用? View Controller 的 awakeFromNib 在什么精确点被调用?从我的调试 session
我开始将更多的 View 层次结构迁移到 IB。 我有一个名为“AlignmentViewController.xib”的 nib 文件,在其中我使用 AlignmentViewController
我尝试从 awakeFromNib 调用 performClick: 但它不起作用。我认为这是因为它需要一个发送者,而 awakeFromNib 没有发送者。我尝试过使用 nil、self 和 sen
TableData 是 NSObject 的子类,作为基于 View 的表的数据源和表委托(delegate)。 TableData 的 awakeFromNib 方法将运行多次,因为我使用的是基于
我想了解为什么如果我尝试在 init 方法中为对象(如 NSButton)设置值(即 setAlphaValue 或 setTitle),则不会发生任何事情,但如果我在 awakeFromNib 中调
我看到了这段代码: CoolButton *coolButton = [[CoolButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 60.0f, 2
我使用 UIBezierPath 和 CAShapeLayer 以及以下代码创建了圆形进度 View 。 let center = self.center let trackLayer = CASha
我有以下代码: - (void) awakeFromNib { CGRect temp = self.buttonOne.frame; temp.origin.y += 50;
从 Xcode 8 更新中,它刚刚注意到,对于 UITableViewCell 的 awakeFromNib 方法,内部没有内容(在使用 xib 文件添加自定义单元格类时自动创建),给出我以下警告。
在 UIView 类别的 -awakeFromNib 方法中编写代码是否安全。 UIView+XXXXXX.m @implementation UIView (XXXXXX) - (void) awa
我有一个 Storyboard应用程序。当第一个 View 在启动时加载时,我有这段代码来实例化我的主后台线程,并且一切正常。 public override void AwakeFromNi
我的项目中有两个自定义 View 需要以完全相同的比例缩放。所以我决定为此使用 UIScrollView,它非常适合。 我决定开发一个非常简单的继承自 UIScrollView 的类,并在其中初始化所
我是一名优秀的程序员,十分优秀!