【发布时间】:2015-03-04 16:02:38
【问题描述】:
我是 XCode/iOS 领域的新手;我已经完成了一些相当大的基于故事板的应用程序,但我从来没有在整个 nib/xib 事情上咬牙切齿。我想对场景使用相同的工具来设计/布局可重用的视图/控件。所以我为我的视图子类创建了我的第一个 xib 并将其绘制出来:
我已经连接了插座并设置了约束,就像我在故事板中习惯的那样。我将File Owner 的类设置为我的自定义UIView 子类。所以我假设我可以使用一些 API 来实例化这个视图子类,并且它会如图所示进行配置/连接。
现在回到我的故事板,我想嵌入/重用它。我在表格视图原型单元格中这样做:
我有一个看法。我已经将它的类设置为我的子类。我已经为它创建了一个出口,所以我可以操纵它。
64 美元的问题是我在哪里/如何表明仅将视图子类的空/未配置实例放在那里是不够的,而是使用我创建的 .xib 来配置/实例化它?如果在 XCode6 中,我可以只输入 XIB 文件以用于给定的 UIView,那就太酷了,但我没有看到这样做的字段,所以我假设我必须在某处的代码中做一些事情。
(我确实在 SO 上看到过类似的其他问题,但没有发现任何关于这部分难题的问题,或者是最新的 XCode6/2015)
更新
我可以通过如下实现表格单元格的awakeFromNib 来完成这项工作:
- (void)awakeFromNib
{
// gather all of the constraints pointing to the uncofigured instance
NSArray* progressConstraints = [self.contentView.constraints filteredArrayUsingPredicate: [NSPredicate predicateWithBlock:^BOOL(id each, NSDictionary *_) {
return (((NSLayoutConstraint*)each).firstItem == self.progressControl) || (((NSLayoutConstraint*)each).secondItem == self.progressControl);
}]];
// fetch the fleshed out variant
ProgramProgressControl *fromXIB = [[[NSBundle mainBundle] loadNibNamed:@"ProgramProgressControl" owner:self options:nil] objectAtIndex:0];
// ape the current placeholder's frame
fromXIB.frame = self.progressControl.frame;
// now swap them
[UIView transitionFromView: self.progressControl toView: fromXIB duration: 0 options: 0 completion: nil];
// recreate all of the constraints, but for the new guy
for (NSLayoutConstraint *each in progressConstraints) {
id firstItem = each.firstItem == self.progressControl ? fromXIB : each.firstItem;
id secondItem = each.secondItem == self.progressControl ? fromXIB : each.secondItem;
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem: firstItem attribute: each.firstAttribute relatedBy: each.relation toItem: secondItem attribute: each.secondAttribute multiplier: each.multiplier constant: each.constant];
[self.contentView addConstraint: constraint];
}
// update our outlet
self.progressControl = fromXIB;
}
那么这很容易吗?还是我为此付出了太多努力?
【问题讨论】:
-
1) 你不应该指定文件的所有者,因为如果 xib 只是自定义视图,你就没有文件的所有者。当你加载 nib owner 参数时应该是 nil。 2)您应该为您的视图指定自定义类。并将插座连接到此视图
标签: ios objective-c xcode interface-builder uistoryboard