25

我正在制作一个我想在多个笔尖中使用的自定义小部件。所以我创建了一个新的视图笔尖 Screen3,添加了一些按钮,现在想要我的 UIAwesomeSauce 小部件。

如果我只是添加一个视图然后更改类标识,它不会从 UIAwesomeSauce nib 获取子元素。如果我去图书馆并切换到类,同样的事情。似乎只有 UIViewController 具有“从笔尖加载”的字段,这会很漂亮。

我知道我可以从代码中加载 UIAwesomeSauce 笔尖,获取顶级对象,然后手动放置。但 IB 的意义在于,您不必将内容放入代码中。如果我能让 UIAwesomeSauce 出现在库列表本身中,那就更好了。

已解决 - 由 Nimrod - 继续阅读以获取解释和代码

无论如何,dood,那太好了。我现在可以为愚蠢的真棒东西制作自己的小部件类。让你的 UI nib 的 FileOwner 成为你的类,在里面只有一个普通的 UIView 和你所有的东西。(小部件笔尖中的单个视图不能是类本身,否则您会在 initWithCoder 中递归。)然后在您要使用它的笔尖中,制作一个普通的 UIView 并更改其类。您将无法真正看到该正方形内的小部件,但可以交易。

Self 现在是一个空白视图,而 tMyActualSelf 是您在另一个 nib 中进行工作的单一视图。耶!

- (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;
}
4

2 回答 2

14

当 UIViewController 是唯一可以指定 nib 加载的东西时,我感到你很痛苦,但我认为这是因为必须有一个文件所有者是一个控制器,或者类似的东西,虽然我不知道为什么UIView 不能是文件的所有者。

我认为您可以将内容放在自定义对象下的库中,但我认为您只能将 UIView 放在那里,而该类只是设置为 UIView 的自定义子类。我实际上考虑过尝试扩展界面构建器,看起来你可以为 OS X 的东西做这件事,但不能为 iPhone 的东西做。它涉及在界面构建器中为新小部件编译代码,以告诉它如何在 IB 中绘制小​​部件。我认为实际上有一个 OS X 模板。

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

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

编辑

现在我看它,我认为 UIView 可以是文件的所有者,你只是不能在 IB 中设置它。基本上你会在 UIView 子类中调用类似这样的 nib 加载:

[bundle loadNibNamed:@"UISpecialSauce" owner:self options:...]

我认为,如果您在 UISpecialSauce 或其他任何内容中创建插座,那么由于所有者:自我,它们应该被正确分配。

于 2010-10-15T18:47:15.140 回答
0

有一个 cocoapod 可能实际上对此有所帮助: https ://github.com/mobilejazz/NibWrapper

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

于 2014-05-02T08:52:50.593 回答