我开始将更多的视图层次结构移动到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;
}
Run Code Online (Sandbox Code Playgroud)
有人能为我澄清我在这里错过了什么吗?
干杯,道格
更新:在阅读了一些答案后,我意识到我需要深入了解非常基本的东西.
看初始化:
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
Run Code Online (Sandbox Code Playgroud)
我注意到我正在调用initWithNibName:bundle:indirect.这是不好的做法吗?AlignmentViewController.xib文件定义了我的视图层次结构.但我不是真的使用initWithNibName:bundle:以典型的方式?有一个更好的方法吗?
我正在使用故事板(这是全新的!).
如何使用storyboard选项导入现有的xib文件并将它们集成到单个文件中?
我收到包含a的每个nib文件的警告UIActivityIndicator.
警告说明:
Unsupported Configuration: Hides when stopped but is neither hidden or animating
我究竟做错了什么?
有没有办法在Interface Builder中隐藏一些视图?我并不是说在应用程序启动时隐藏它,而是在Interface Builder中隐藏它以便我看到其他视图.其实我想这样做,因为我的xib文件有很多视图,很难看到!
我想知道使用.xib文件进行GUI设计和以编程方式执行此操作之间是否存在差异.
因为它是一个编译器,我认为没有相关的时间丢失.
我错了吗?
我有一个UIView的子类,需要根据它的宽度来计算它的高度.在代码中创建时一切正常.但是,当我尝试在"界面"构建器中创建视图时,虽然我覆盖了所有相关方法,但我无法在界面构建器中获取视图集的大小.
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"init with coder before super width %d",super.frame.size.width); // returns 0
self = [super initWithCoder:aDecoder];
NSLog(@"init with coder after super width %d",super.frame.size.width); // still returns 0
}
- (void) awakeFromNib
{
NSLog(@"width of view %d",super.frame.size.width); // Returns 0 as well
}
- (void) setFrame:(CGRect)aFrame
{
[super setFrame:aFrame]; // Called from initWithCoder by super. Correct frame size.
}
Run Code Online (Sandbox Code Playgroud)
所以我的下一个猜测是,我的视图的超级视图可能是在awakeFromNib之后设置我的视图框架.好吧事实证明它没有.我在我的视图上覆盖了setFrame,并在initWithCoder期间调用它.
所以这就是我目前所知道的:
任何帮助将不胜感激
在运行iOS 8时,IBOutlet我的基于nib的视图控制器的s是nil,但是在运行iOS 9时,它们工作正常.任何想法为什么会这样?
我的应用程序支持iOS 8+,我正在运行Xcode 7.2.
我发现这个问题的文档不清楚:
假设你正在使用iOS(不是Mac的情况,不需要提及差异).说严格是4.0+(不需要提及旧操作系统的差异).假设我们严格自动加载NIB.
假设你有一个UIViewController,BigView.假设NIB文件中有十几个所谓的"顶级"项目......可以是自定义控件,图像或其他任何内容.
假设您肯定会在应用程序运行期间多次明确创建然后摆脱BigView.所以:
对于NIB中的其中一个顶级项目,有三种可能性:
(1)根本没有任何形式的IBOutlet.
(2)你有一个连接的IBOutlet - 但不是属性.
(3)你确实有一个连接的IBOutlet属性(为了避免混淆,我们会说保留属性).
那么BigView发布时项目会发生什么?
在(3)的情况下,您必须明确释放.如果你不这样做,它将在视图消失后徘徊.没问题.
在(1)的情况下,我假设(但是任何人都可以确认?)当BigView消失时该项目将被释放.
在(2)的情况下,不清楚会发生什么.......
看看众所周知的参考链接:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html这是非常可疑的:
"在iOS中,nib加载代码使用setValue:forKey:方法重新连接每个插座.该方法类似地寻找一个合适的访问器方法和[所以如果没有一个发生的话会发生什么?告诉我们APPLE ...]当失败时,它会回到其他方式...... [GOOD GRIEF!]"
并查看此文档:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html并向下滚动到"Nib对象保留"
所以......
"nib文件中的对象创建时保留计数为1,然后自动释放" Fantastic ..
可是等等!读几句话......
但是,...如果没有可用的setter方法,则使用可用的setter方法或默认保留对象
他们在说什么?
它们是否意味着如果没有可用的setter(ivar,但没有属性),它是AGAIN RETAINED(除了他们在前一条款中提到的"保留") - 或者,他们只是重复自己,即"默认保留对象"与他们之前刚刚讨论的"保留"相同("使用保留计数1创建然后自动释放").
为什么他们甚至会提到自动释放,如果不是这样的话?
确实 - 如果有人真正明确知道这个问题的答案...... 你怎么知道的?!?你问过DTS,还是通过测试,或者?我建议,关键文档(只是粘贴)是非常不清楚的.
再次 - 如果你有一个IBOutlet,但不是一个属性,连接到"顶级"对象.. 你有责任释放它吗?它保留了吗?在那种情况下?
就此而言....仅仅在情况(1)中,当BigView消失时,它会被释放吗?我当然会认为情况确实如此,但谁知道呢?
问题是如果你使用IBOutlet iVar会发生什么,而不是属性......
我愚蠢地从来没有想过这个/假设太多,有没有人有决定性的答案?干杯!!
为了记录,我做了一个测试项目.
事实上(令我惊讶的是)将IB元素连接到IBOutlet的单纯行为实际上显然增加了一个保留.
(我只能从伪劣的文件中假设,在那种情况下你特别得到:保留,自动释放,保留 - 导致一个保持平衡.)
所以,这就是答案.
我将发布演示项目.我也将任何读者引导到下面的Jonah的答案,它完美地解释了setValue的行为:forKey:干杯
将设备设置为从右到左语言时,iOS会反转项目的顺序.
例如,在使用自动布局设置的UITableViewCell中:我在左侧有一个头像图像,右边有一些文本对齐,这些文本填满了单元格的其余部分.在阿拉伯语中,我的头像位于右侧,我的标签位于左侧.
有没有办法阻止iOS在某些视图上执行此操作,或者是否有一个通用设置来定义它是否可以反转?
我希望通过类别方法添加一个新IBInspectable属性(计算属性)UILabel.理想情况下,我希望在设置标签文本后设置此属性(通过setValue:forKey),因为此IBInspectable属性可能导致UILabels文本被更新,我们不希望UILabel稍后的文本替换它.查看文档时,没有提及nib/storyboard在Interface Builder中配置的属性的加载期间是否始终在用户定义的属性之前设置预定义的属性.
是否使用自定义属性添加到Interface Builder中的对象IBInspectable或保证在标准预定义对象属性/属性之后设置用户定义的运行时属性?
nib ×10
ios ×6
iphone ×5
xcode ×3
xib ×3
storyboard ×2
autolayout ×1
cocoa-touch ×1
iboutlet ×1
objective-c ×1
performance ×1
swift ×1
uiview ×1
xcode5 ×1