Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将.xibs加载到UIView中_Iphone_Uiview - Fatal编程技术网

Iphone 将.xibs加载到UIView中

Iphone 将.xibs加载到UIView中,iphone,uiview,Iphone,Uiview,我有一个带有自己的.xib的UIViewController,我想使用UISegmentedControl在屏幕的下半部分显示不同的信息。我在容器的.xib中创建了一个UIView,并将其连接到容器的UIViewController中名为detailView的UIView属性 然后,我在IB中创建了三个.xib文件,其中一个用于每个片段需要在detailView区域中显示的视图 我现在被卡住了,因为我不知道如何将适当的.xib文件加载和卸载到detailView区域。我就在这里: - (void

我有一个带有自己的.xib的UIViewController,我想使用UISegmentedControl在屏幕的下半部分显示不同的信息。我在容器的.xib中创建了一个UIView,并将其连接到容器的UIViewController中名为
detailView
的UIView属性

然后,我在IB中创建了三个.xib文件,其中一个用于每个片段需要在
detailView
区域中显示的视图

我现在被卡住了,因为我不知道如何将适当的.xib文件加载和卸载到
detailView
区域。我就在这里:

- (void)segmentValueChanged:(id)sender {
    switch ([sender selectedSegmentIndex]) {
        case 0:
            // Unload whatever is in the detailView UIView and 
            // Load the AddressView.xib file into it
            break;
        case 1:
            // Unload whatever is in the detailView UIView and 
            // Load the ContactsView.xib file into it
            break;
        case 2:
            // Unload whatever is in the detailView UIView and 
            // Load the NotesView.xib file into it
            break;
        default:
            break;
    }
}
那么,如何正确地填充空格和卸载/加载detailView UIView呢

谢谢

--更新--

viewDidLoad中的代码现在是: -(无效)viewDidLoad{ [超级视图下载]

    // Set the default detailView to be address since the default selectedSegmentIndex is 0.
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil];
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder)
    UIView *nibView = [nibObjects objectAtIndex:0];
    self.detailView = nibView;

    self.detailContainerView.autoresizesSubviews = YES;
    [self.detailContainerView addSubview:self.detailView];

    NSLog(@"self.view is %@", self.view);
    NSLog(@"self.detailContainerView is %@",self.detailContainerView);
    NSLog(@"self.detailView is %@", self.detailView);
}
调试器消息包括:

self.view is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190
self.detailContainerView is UIView: 0x3a1aea0; frame = (20 57; 280 339); autoresize = W+H; layer = CALayer: 0x3a36b80
self.detailView is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190

谢谢!

使用NSBundle的
loadNibNamed:owner:options:
。它返回NIB文件中所有顶级对象的数组,然后可以将其分配给IVAR。如果需要区分数组中的多个对象,请在IB中为每个对象指定一个唯一的标记

试试这个:

case 0:
    [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil];
    break;
...
如果已在Interface Builder中将视图控制器指定为AddressView.xib的文件所有者,并已将xib中的视图连接到视图控制器的detailView出口,则调用loadNibNamed后,视图和self.detailView之间的连接应处于适当位置(因为您已将self指定为所有者)

如果这不起作用,请尝试以下方法:

case 0:
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil];
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder)
    UIView *nibView = [nibObjects objectAtIndex:0];
    self.detailView = nibView;
    break;
...

对switch语句中的所有情况执行相同的操作。如果已将detailView声明为
@property(retain)
self.detailView=…
分配将负责释放任何以前加载的视图。无需专门卸载NIB内容。

基本上,您需要使用UIViewController的initWithNibName来执行您想要的操作:

UIViewController*aViewController=[[UIViewController alloc]initWithNibName:@“AddressView”bundle:nil];
[self.detailView addSubview:aViewController.view];
[aViewController释放];//释放VC
在AddressView xib中,将文件的所有者类设置为UIViewController。视图的类应为自定义AddressView类


通过这种方式,您可以使用主xib文件定位和调整子视图的大小。然后使用子视图的xib来布局控件。

我不太确定如何将其组合在一起。是否需要为每个.xib文件调用
loadNibNamed:owner:options:
?是否可以看到一些粗略的代码来了解如何操作?谢谢非常感谢!Ole,谢谢你的精彩代码!我遇到的唯一问题是,当我调用-loadNibNamed:owner:options时,NIB被覆盖在它应该位于其中的整个视图的顶部。似乎
self.detailView=nibView;
没有调整加载的NIB的大小以适应在IB中设置的detailView。有什么想法吗这里?谢谢!不,当然不是。
self.detailView=nibView;
只是一个简单的设置程序。您可以调整视图在代码中的位置,或者在主视图的nib中放置一个空白的ui视图,将其用作容器,然后执行类似于
[self.detailContainerView addSubview:self.detailView]的操作;
。即使我这样做了,整个视图仍然被覆盖,从调试器上看,detailView似乎与其父视图具有相同的地址。我编辑了我的原始帖子,以显示代码和调试器消息…谢谢!你为什么要将详细视图设置为320×460像素大,而这不是你想要的?你不能直接设置吗IB的大小正确吗?