【发布时间】:2011-08-25 13:50:08
【问题描述】:
如果我创建一个单独的 nib 文件并将其加载到我的视图控制器中并将其分配给 ivar,如下所示:
self.loadingview=[[[NSBundle mainBundle] loadNibNamed:@"loading" owner:self options:nil] objectAtIndex:0];
是否可以为笔尖上的任何东西创建 IBOutlets,比如活动指示器?文件的所有者是否会成为视图控制器,即使 IB 不知道这一点,因为它是在代码中创建的对象?
按照我的方式加载笔尖是可接受的做法吗?
也许更可接受的做法是创建一个 .h/.m,并将其用作 XIB 的类,在这种情况下,File's Owner 是新的自定义类;不过,从自定义类创建 ivar 时,我仍然需要在我的控制器中使用上述方法,对吗?或者有没有更好的方法来完成这一切,而不使用控制器的 xib?
更新:根据一些答案,我做了以下事情。我摆脱了上面的NSBundle 方法,而是这样做:
@property (nonatomic, retain) IBOutlet UIView*loadingview;
在此视图的 nib 文件中,我单击 File's Owner 并将 Custom Class 更改为我的视图控制器。然后我从 File's Owner 控制并拖动到视图,它链接起来很好。
此时我假设我的控制器中有一个 ivar,self.loadingview,其中包含 nib 中的信息。然而事实并非如此。我删除了 NSBundle 方法,假设控制器现在将直接通过 IB 插座加载 nib,但 nib 中的视图没有显示,并且我无法在控制器中控制它。
我在删除 NSBundle 方法时也删除了这个:
[self.view addSubview:self.loadingview];
我不清楚此时视图的实际显示方式;如果是这样,它出现在视图层次结构中的什么位置?也许它落后于其他观点。我也试过这个:
[self.view bringSubviewToFront:self.loadingview];
但视图并不存在。为了找到它,我做了:
//[self.view bringSubviewToFront:self.loadingview];
NSLog(@"index: %i",[[self.view subviews]indexOfObject:self.loadingview]);
有和没有注释部分。我明白了:
index: 2147483647
【问题讨论】:
-
问题已解决。我了解到,即使从 nib 加载视图,您仍必须使用
addSubview才能显示它 -
您的编辑使这个问题完全不同。您应该开始一个新问题,以便以后的搜索者可以找到它。
标签: objective-c interface-builder