许多人都问过类似的问题,但反应是要么只是含糊不足或没有我需要的东西去的方向,所以我会尝试尽可能具体地问这个。这个问题的背景是使用的XCode 4自定义的UIView配置了InterfaceBuilder的
我有一个应用程序,我用同样的Widget无数次iOS开发。在这个简单的练习中,小部件将是一个固定大小的红色框,在顶部有一个标签,根视图控制器将会改变,但您可以想象它有很多ImageViews和ScrollViews,看起来很漂亮。最后一点是关键,因为非编码艺术设计师希望能够全局调整此视图,而不必在每个重复的用户界面上反复做同样的事情。
在应用程序中,我用单个UIView替换了用于组成widget的ImageViews和ScrollView,并使用InterfaceBuilder将Custom Class设置为Widget
。我在根视图控制器中为这些Widget对象正确连接了插座。 Widget类是UIView的一个子类,代码如下:
@interface Widget : UIView {
UILabel *label;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) NSString *labelName;
@end
@implementation Widget
@synthesize label, labelName;
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
// This is the code that I want to disappear
CGRect pos = CGRectMake(5, 5, 90, 30);
label = [[UILabel alloc] initWithFrame:pos];
[self addSubview:label];
self.backgroundColor = [UIColor redColor];
}
return self;
}
- (NSString *)labelName {
return label.text;
}
// This live updates the label in this custom view
- (void)setLabelName:(NSString *)name {
label.text = name;
}
- (void)dealloc {
[super dealloc];
}
@end
代码的伟大工程,我能活更新从主视图控制器的自定义视图中的文本。但是,initWithCoder中的四行代码是问题所在。还记得设计师吗?我有他们的地方,他们可以用界面生成器来发挥他们的魔力,但是我不能为我的生活弄清楚如何让UIView从他们设计的笔尖加载自己。手动尝试和复制单个项目的定位和属性并不是非常令人兴奋和相当耗时(如果我没有写这篇文章,我意识到现在我会完成)。
所以很干脆,我怎么能取任意的.xib文件,并将它做我的手卷中的initWithCoder的工作?我认为在这一点上将微不足道的联系到UILabel的IBOutlet,但如果我过于乐观,请对此评论。
作为第二个问题,一旦启动并在实际运行的UI,我会之类的东西,UIScrollViews勾搭上了。 Widget会成为UIScrollViewDelegate还是代码停放在哪里?根视图控制器应该忘记这一点,但将传统上放在View Controller中的代码放到UIView对象中感觉不合适。
如果你的小部件对于它的视图来说不仅仅是一个愚蠢的容器,为什么不把它变成视图控制器呢? – jrturton 2013-01-14 07:36:56