如何将 UIViews 添加到我的 contentView (AwakeFromNib)
Posted
技术标签:
【中文标题】如何将 UIViews 添加到我的 contentView (AwakeFromNib)【英文标题】:How do I add UIViews to my contentView (AwakeFromNib) 【发布时间】:2016-09-08 09:40:52 【问题描述】:我正在使用从 awakeFromNib
启动的单独的 UIView
类这是视图层次结构
在我的自定义类中,我必须将自定义视图添加到contentView
。我不知道如何将我的 customViews 作为子视图添加到 contentView。
这是我的尝试,但我失败了。
#pragma mark - UINibLoading
-(void)awakeFromNib
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
[self loadViewIntoMemory];
[self formUpdateDetailsData];
#pragma mark - Private
- (void)loadViewIntoMemory
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
[self addSubview:contentView];
- (void)formUpdateDetailsData
for (int i = 1; i < 5; i++)
inputTextView = [[UIView alloc] initWithFrame:CGRectMake(15, ((i*44)+(i*15)), inputTextView.frame.size.width, 44)];
[contentView addSubview:inputTextView];
for (int i = 5; i < 10; i++)
inputPickerView = [[UIView alloc] initWithFrame:CGRectMake(15, ((i*44)+(i*15)), inputPickerView.frame.size.width, 44)];
[contentView addSubview:inputPickerView];
【问题讨论】:
你在这个类中做什么,你如何在你的 ViewController 中加载这个类。同样在 loadViewIntoMemory 方法中,您再次加载了一个 Nib。此方法将调用 awakeFromNib ,因此这里是一个循环。 这个类将通过 awakeFromNib 加载 这里的主要问题是您在调用 awakeFromNib 的 loadViewIntoMemory 中调用 loadNibNamed。然后 awakeFromNib 调用 loadViewIntoMemory ,这是一个无限循环。测试这个东西在你的两个方法上放置断点然后你就会知道这段代码是如何执行的。 【参考方案1】:尝试编写一个初始化方法,它将返回您从 .xib 文件加载的自定义 UIView,
- (instancetype)initYourView
return [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil].firstObject;
【讨论】:
什么是firstObject?我怎么知道这是我需要的视图? 如果你有困惑,最好的做法是这样做, + (id)loadNibNamed:(NSString *)nibName ofClass:(Class)objClass if (nibName && objClass) NSArray * objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:nil options:nil]; for (id currentObject in objects ) if ([currentObject isKindOfClass:objClass]) return currentObject; 返回零; 【参考方案2】:我了解以下您已经创建了一个 .xib 文件,其中包含三个视图 1. ContentView 2. input textview 3. Input picker view
现在您想在内容视图中添加输入视图和输入选择器视图。
现在你可以通过两种方式做到这一点 1.创建输入文本视图和输入选择器视图的IBOutlet,并在内容视图中添加子视图。
您创建视图对象并像这样在内容视图中添加子视图。
- (void)loadInputViewInMemory
UIView *inputView =[[[NSBundle mainBundle]loadNibNamed:@"CustomView" owner:nil options:nil]objectAtIndex:1];
[self addSubview:inputView];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[inputView]|" options:0 metrics:0 views:[NSDictionary dictionaryWithObjectsAndKeys:inputView,@"inputView",nil]]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[inputView]|" options:0 metrics:0 views:[NSDictionary dictionaryWithObjectsAndKeys:inputView,@"inputView",nil]]];
现在使用您在 ViewController 上创建的自定义视图对象调用此方法。
例子
ViewController 代码在视图中已加载或您要添加自定义视图的位置
// You custom view in your case content view.
CustomView *customView = [[[NSBundle mainBundle]loadNibNamed:@"CustomView" owner:self options:nil]objectAtIndex:0];
[self.view addSubview:customView];
customView.translatesAutoresizingMaskIntoConstraints = false;
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[customView]|" options:0 metrics:0 views:[NSDictionary dictionaryWithObjectsAndKeys:customView,@"customView",nil]]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|" options:0 metrics:0 views:[NSDictionary dictionaryWithObjectsAndKeys:customView,@"customView",nil]]];
//Call Methods from here instead of calling from awake from nib
[customView loadInputViewInMemory];
同样的方式你可以调用自定义选择器视图添加方法 你需要 将选取器视图的索引更改为 2
喜欢,
UIView *inputView =[[[NSBundle mainBundle]loadNibNamed:@"CustomView" owner:nil options:nil]objectAtIndex:2];
希望对您有所帮助。
【讨论】:
以上是关于如何将 UIViews 添加到我的 contentView (AwakeFromNib)的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 Contentful 将帖子列表添加到我的主页而不是 Gatsby 中的单独页面
Swift - 如何将点击手势添加到 UIViews 数组?
将 UIViews 作为子视图添加到 UIViewController [关闭]