10

我通常以编程方式创建我的自定义视图,并让它们也可以通过自定义初始化方法(例如 initWithFrame:SomeParam:OtherParam)以编程方式初始化。是否可以将此类自定义视图与 xib 文件结合使用?也就是说,有一个父 xib 文件,其中包含各种这些自定义视图作为子视图,其中这些子视图可能需要使用不同的 init 方法?

4

4 回答 4

10

如果将自定义视图添加到 xib 文件中,则不能使用自定义初始化程序。它们都将使用initWithCoder.

通常,您会在从那里调用的通用方法中进行任何设置,或者在awakeFromNib.

如果您需要在视图上设置任何源自外部的自定义属性,请在viewDidLoad视图控制器中进行。

于 2012-06-13T06:05:45.203 回答
6

获取视图的 xib 以常规方式初始化并使用参考进行自定义设置。这部分可以像这样放在init方法中-

     -(void)initfunction{
        UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"myView"  owner:self    options:nil] lastObject];
       containerView.property1 = xyz;//Customization
       containerView.property2= abc;//Customization
       containerView.frame = CGRectMake(x,y,z,p);//Customization
       [rootView addSubview:containerView];


   }

关键是当我们使用我们没有显式初始化的 xib 时,xib实用程序函数返回一个初始化的对象(of UIView),在获得UIView对象后,他/她可以将初始化的对象用作常规对象来进行进一步的自定义更改。

于 2012-06-13T06:20:47.083 回答
2

当然有可能。在 xib 中拖动一个 uiview,而不是在默认视图内。然后制作一个IBOutlet UIView *myCustomView;,然后将其与另一个视图连接起来。当你想显示这个视图[self.view addSubview:myCustomView];时添加这个作为想要删除它的时候

[myCustomView removeFromSuperView];

在此处输入图像描述

于 2012-06-13T05:45:53.683 回答
0

UINib (iOS) 和 NSNib (OS X) 类在您想要创建 nib 文件内容的多个副本的情况下提供更好的性能。正常的 nib 加载过程包括从磁盘读取 nib 文件,然后实例化它包含的对象。但是,对于 UINib 和 NSNib 类,nib 文件从磁盘读取一次,内容存储在内存中。因为它们在内存中,所以创建连续的对象集需要更少的时间,因为它不需要访问磁盘。

  1. 创建单视图 xib 文件:右键单击项目 -> 新建文件 -> 用户界面 -> 视图(例如,您将拥有“MyView.xib”)
  2. 使用 Interface Builder 填充视图
  3. 将下一个方法添加到您的父组件

    static UINib *nib = nil;
    
    - (UIView*)createNewViewFromNib: (NSString *)nibFileName
    {
        if( nib == nil) {
            nib = [UINib nibWithNibName:nibFileName bundle:nil ];
        }
    
        // Unarchiving objects from the nib. You can do it multiple times to create a number of objects from same nib.
        NSArray*    topLevelObjs = [nib instantiateWithOwner:self options:nil];
    
        if (topLevelObjs == nil)
        {
            NSLog(@"Warning! Could not load nib file.\n");
            return nil;
        }
        // We have only one view in the nib.
        return [topLevelObjs objectAtIndex:0];
    }
    
  4. 使用下一行代码用可重用的 nib 对象实例化您的视图:

    UIView *item = [self createNewViewFromNib:@"MyView"];
    // [self.view addSubview:item];
    
于 2013-04-13T08:48:50.533 回答