如何在Interface Builder中获取视图以在另一个笔尖中加载自定义视图?

时间:2010-10-15 18:20:07

标签: iphone interface-builder nib custom-view

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

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

我知道我可以从代码中加载UIAwesomeSauce笔尖,获取顶级对象,然后手动放置它。但IB的观点是,您不必将代码置于代码中。如果我能让UIAwesomeSauce显示在图书馆列表中,那就更好了。

已解决 - 由Nimrod撰写 - 阅读解释和代码

无论如何,dood,那太好了。我现在可以制作自己的小部件类,用于愚蠢的真棒。让您的UI的FileOwner成为您的类,并在其中只有一个普通的UIView与您的所有东西。 (小部件的nib中的单个视图不能是类本身,或者你在initWithCoder中得到递归。)然后在你要使用它的nib中,创建一个vanilla 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;
}

2 个答案:

答案 0 :(得分:14)

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

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

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

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

修改

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

[bundle loadNibNamed:@“UISpecialSauce”所有者:自我选项:...]

我认为如果您在UISpecialSauce或其他任何地方创建商店,那么因为所有者:self而应该正确分配它们。

答案 1 :(得分:0)

Theres a cocoapod可能实际上有助于此: https://github.com/mobilejazz/NibWrapper

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