如何在界面生成器中获取视图以在另一个笔尖中加载自定义视图?

问题描述:

我正在制作一个我想用于多个笔尖的自定义小部件。所以我做了一个新的视图笔尖Screen3,添加了一些按钮,现在想要我的UIAwesomeSauce小部件。如何在界面生成器中获取视图以在另一个笔尖中加载自定义视图?

如果我只是添加一个视图,然后更改类标识,它不会从UIAwesomeSauce笔尖获取子元素。如果我去图书馆并切换到类,也是如此。似乎只有一个UIViewController具有“从笔尖加载”字段,这将是美丽的。

我知道我可以从代码中加载UIAwesomeSauce笔尖,获取*对象,然后手动放置它。但是IB的观点是,您不必将代码放入代码中。如果我能够让UIAwesomeSauce出现在库列表中,那更好。

解决 - 由宁录 - 请继续阅读说明和代码

反正DOOD,这是伟大的。我现在可以制作我自己的窗口小部件类,用于傻瓜Awesome的东西。让你的UI的FileOwner成为你的类,并且在它里面有一个正常的UIView和你所有的东西。 (小部件的nib中的单个视图不能是类本身,或者您在initWithCoder中递归)。然后在要使用它的nib中,创建一个vanilla UIView并更改它的类。您将无法真正看到该广场内的小部件,但交易。

自己现在是一个空白的视图,tMyActualSelf是你在另一个笔尖中完成工作的单一视图。好极了!

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if ((self = [super initWithCoder:coder])) 
    { 
     UIView *tMyActualSelf = nil; 
     // Initialization code 
     NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil]; 
     for (id object in tNibItems) 
     { 
      if ([object isKindOfClass:[UIView class]]) 
       tMyActualSelf = (UIView *)[object retain]; 
     } 
     if(tMyActualSelf) 
     { 
      tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
      [self addSubview:tMyActualSelf]; 
     } 
    } 
    return self; 
} 

我觉得你的疼痛,当它涉及到的UIViewController是你可以指定用笔尖负载的唯一的事,但我认为这是因为必须有一个文件的所有者,这是一个控制器,或类似的东西,尽管我不确定为什么UIView不能成为文件的所有者。

我认为你可以把东西放在自定义对象下的库中,但我认为你只能将UIView放在那里,只需要将类设置为UIView的自定义子类。实际上,我试图扩展接口生成器,看起来你可以做OS X的东西,但不是iPhone的东西。它涉及在界面构建器中编译新小部件的代码,告诉它如何在IB中绘制小部件。我认为这其实是一个OS X模板。

我想我可能会做的是在包含所有子视图的nib文件中创建一个主视图,然后在initWithCauce中:在UIAwesomeSauce中打开nib文件,加载主视图并将其放入内部这样你就可以在UIAwesomeSauce视图和子视图(或子视图)之间有一个“不必要”的视图。我不确定这是多么的低效,但是在一些东西看起来像一些视图像UIWebView似乎有这些看似不必要的中间视图(IIRC)之一。

如果你想出一个更好的解决方案,请告诉我,因为我也想知道。

编辑

现在,我看着它,我想了UIView可以是文件的所有者,你不能把它架在IB。基本上,你会打电话笔尖负荷像这样的UIView子类:

[束loadNibNamed:@“UISpecialSauce”老板:自我选择:...]

我觉得如果你在UISpecialSauce或建立网点无论如何,他们应该正确分配,因为所有者:自我。

+1

这太棒了我想烤你一个馅饼。 – CBGraham 2010-10-15 20:16:47

+0

耶!我终于有足够的积分在帖子上投票了,所以你们就去了。 (你应该可以在自己的问题上对帖子进行投票,就像你可以在自己的问题上对帖子发表评论一样。) – CBGraham 2011-01-19 18:41:02

+0

对于扫描问题并详细阅读答案的任何人(如我),提问者将他的“已解决“代码作为他原始问题中的编辑。 – 2011-11-29 21:54:22

即使世界一个cocoapod可能实际上是帮助: https://github.com/mobilejazz/NibWrapper

它提供了加载从另一个NIB子视图的包装视图。您可以通过运行时属性在界面构建器中指定该NIB的名称。

+0

谢谢,我找到你的参考后使用了这个。经过几天的阅读后,这对我有很大帮助。唯一遗憾的是有一个间接的级别,因为你必须设置一个UIView占位符(类UINibWraper),并从中获得对你的自定义UIView的引用。还有另外一种cocoapod采用了不同的方法,理论上它可以去除这个额外的图层(UIView + NibLoading),但是在自定义视图中使用自动布局约束会让我崩溃。 – 2014-06-18 11:24:27