自定义XIB的"文件所有者"

joh*_*ers 6 objective-c interface-builder

如果我创建一个单独的nib文件并将其加载到我的viewcontroller中并将其分配给ivar,如下所示:

self.loadingview=[[[NSBundle mainBundle] loadNibNamed:@"loading" owner:self options:nil] objectAtIndex:0];

是否有可能在笔尖上的任何东西上创建IBOutlets,比如活动指标?文件的所有者是视图控制器,即使IB不知道这一点,因为它在代码中成为一个对象?

按照我做的方式加载笔尖是可接受的做法吗?

也许更可接受的做法是创建.h/.m,并将其用作XIB的类,在这种情况下,File的Owner是新的自定义类; 但是,我仍然需要在我的控制器中使用上述方法,从自定义类创建ivar时,对吗?或者有没有更好的方法来完成所有这些,而不使用控制器的xib?

更新:基于一些答案,我做了以下.我摆脱了NSBundle上面的方法,而只是这样做:

@property (nonatomic, retain) IBOutlet UIView*loadingview;

在此视图的nib文件中,我单击File的Owner并将其更改Custom Class为我的viewcontroller.然后我控制 - 从文件的所有者拖动到视图,它链接正常.

我想在这一点上,我现在在我的控制器中有一个ivar,self.loadingview它包含笔尖中的信息.然而事实并非如此.我删除了NSBundle方法,假设控制器现在直接通过IB插座加载nib,但是nib中的视图没有显示,我在控制器中无法控制它.

当我删除NSBundle方法时,我也删除了它:

[self.view addSubview:self.loadingview];

我不清楚视图实际上是如何显示的; 如果确实如此,那么看来heirarchy会出现在哪里?也许它落后于其他观点.我也试过这个:

[self.view bringSubviewToFront:self.loadingview];

但这种观点并不存在.为了找到它,我做了:

//[self.view bringSubviewToFront:self.loadingview];

NSLog(@"index: %i",[[self.view subviews]indexOfObject:self.loadingview]);

有和没有评论部分.我明白了:

index: 2147483647

Hol*_*nce 6

只是因为你已经创建了一个笔尖,并且在该文件所有者的插座内连接了该笔芯并不会自动从视图控制器加载该笔尖.

你可以使用这个UINib类:

UINib* nib = [UINib nibWithNibName:@"loading" bundle:[NSBundle mainBundle]];
[nib instantiateWithOwner:self options:nil];
Run Code Online (Sandbox Code Playgroud)

完成后instantiateWithOwner:self,将加载笔尖并将其self用作文件所有者,并且笔尖内的视图将连接到您的loadingView属性.

您仍然需要调用[self.view addSubview:self.loadingView]才能将其添加到屏幕上.