我通常以编程方式创建我的自定义视图,并让它们也可以通过自定义初始化方法(例如 initWithFrame:SomeParam:OtherParam)以编程方式初始化。是否可以将此类自定义视图与 xib 文件结合使用?也就是说,有一个父 xib 文件,其中包含各种这些自定义视图作为子视图,其中这些子视图可能需要使用不同的 init 方法?
4 回答
如果将自定义视图添加到 xib 文件中,则不能使用自定义初始化程序。它们都将使用initWithCoder
.
通常,您会在从那里调用的通用方法中进行任何设置,或者在awakeFromNib
.
如果您需要在视图上设置任何源自外部的自定义属性,请在viewDidLoad
视图控制器中进行。
获取视图的 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
对象后,他/她可以将初始化的对象用作常规对象来进行进一步的自定义更改。
当然有可能。在 xib 中拖动一个 uiview,而不是在默认视图内。然后制作一个IBOutlet UIView *myCustomView;
,然后将其与另一个视图连接起来。当你想显示这个视图[self.view addSubview:myCustomView];
时添加这个作为想要删除它的时候
[myCustomView removeFromSuperView];
UINib (iOS) 和 NSNib (OS X) 类在您想要创建 nib 文件内容的多个副本的情况下提供更好的性能。正常的 nib 加载过程包括从磁盘读取 nib 文件,然后实例化它包含的对象。但是,对于 UINib 和 NSNib 类,nib 文件从磁盘读取一次,内容存储在内存中。因为它们在内存中,所以创建连续的对象集需要更少的时间,因为它不需要访问磁盘。
- 创建单视图 xib 文件:右键单击项目 -> 新建文件 -> 用户界面 -> 视图(例如,您将拥有“MyView.xib”)
- 使用 Interface Builder 填充视图
将下一个方法添加到您的父组件
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]; }
使用下一行代码用可重用的 nib 对象实例化您的视图:
UIView *item = [self createNewViewFromNib:@"MyView"]; // [self.view addSubview:item];