我知道以前有人问过这个问题,但答案是矛盾的,我很困惑,所以请不要炒我鱿鱼。
我希望在整个应用程序中有一个可重用的UIView
子类。我想用一个nib文件来描述这个接口。
现在让我们假设它是一个加载指示器视图,其中包含一个活动指示器。我想在某个事件上实例化此视图并在视图控制器的视图中设置动画。我可以用编程的方式描述视图的接口,通过编程创建元素,并在init方法中设置它们的框架等等。
但是,我如何使用笔尖来实现这一点?保持interface builder中给定的大小,而无需设置框架。
我已经设法这样做了,但我肯定这是错误的(这只是一个带有选择器的视图):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
但我正在覆盖self,当我实例化它时:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
我必须手动设置帧,而不是从IB拾取帧。
编辑:我想在视图控制器中创建这个自定义视图,并有权控制视图的元素。我不想要一个新的视图控制器。
谢啦
编辑:我不知道这是否是最佳实践,我肯定不是,但我就是这样做的:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
正确的做法仍然需要
这是否应该使用视图控制器和具有nib名称的init来完成?我应该在代码中的UIView初始化方法中设置nib吗?还是我所做的一切都还可以?
遵循以下步骤
将View的类更改为MyView
。和3一样。
下面是加载View的代码:
UIViewController *controller=[[UIViewController alloc] initWithNibName:@"MyView" bundle:nil];
MyView* view=(MyView*)controller.view;
[self.view addSubview:myview];
希望能有帮助。
澄清:
UIViewController
用于加载您的xib,而UIViewController
所拥有的视图实际上是您在MyView xib中分配的MyView
。。
演示我在这里做了一个演示抓取
如果您想保持您的CustomView
及其xib
独立于File's Owner
,那么请遵循以下步骤
File's Owner
字段留空。CustomView
文件的xib
中的实际视图,并将其Custom Class
设置为CustomView
(自定义视图类的名称). h
文件中添加IBOutlet
。. xib
文件中,单击视图并进入连接检查器
。在这里,您将在. h
文件中定义所有IBOutlet 在中。m
您的CustomView
类的文件,重写init
方法,如下所示
-(CustomView *) init{
CustomView *result = nil;
NSArray* elements = [[NSBundle mainBundle] loadNibNamed: NSStringFromClass([self class]) owner:self options: nil];
for (id anObject in elements)
{
if ([anObject isKindOfClass:[self class]])
{
result = anObject;
break;
}
}
return result;
}
现在,当您想加载CustomView
时,请使用以下代码行[[CustomView alloc]init]
MyViewClass *myViewObject = [[[NSBundle mainBundle] loadNibNamed:@"MyViewClassNib" owner:self options:nil] objectAtIndex:0]
我用它来初始化可重用的自定义视图。
请注意,您可以在最后使用“firstObject”,它更干净一点。“firstObject”是NSArray和NSMutableArray的一个方便方法。
下面是一个典型的例子,加载一个xib用作表头。在你的档案里,你的班级。M
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
return [[NSBundle mainBundle] loadNibNamed:@"TopArea" owner:self options:nil].firstObject;
}
通常,在TopArea.xib
中,您会单击File Owner并将文件所有者设置为YourClass。然后实际上在YourClass. h中,您将拥有IBOutlet属性。在TopArea.xib
中,您可以将控件拖到这些出口。
不要忘记在顶部区域。xib
,您可能需要单击视图本身并将其拖动到某个出口,以便在必要时控制它。(一个非常有价值的提示是,当您对表单元格行执行此操作时,您绝对必须这样做—您必须将视图本身连接到代码中的相关属性。)
问题内容: 我想子类化并显示类似视图的登录名。我已经在Objective- C中创建了它,但是现在我想将其移植到Swift。我不使用情节提要,所以我用代码创建了所有UI。 但是第一个问题是我必须执行。我给了它一个默认的实现,因为它不会被调用。现在,当我运行程序时,它崩溃了,因为我也必须实现。现在我得到了: 我的问题是我应该在哪里创建文本字段等…,如果我从不实现框架和编码器,该如何“隐藏”呢? 问题
您可以看到,我正在将“that”作为参数传递给PrintInfo。如果没有“that”参数,“info”将打印为“undefined”。像下面的例子一样,当从“子类”的对象调用此函数时,“this.info”是未定义的。 如何在javascript中重写和调用超类的方法,使函数能够访问类的实例变量?
问题内容: 我正在尝试以编程方式测试网站列表的加载时间。目的是大致模拟用户将感知的页面加载时间。 我的第一种方法是在循环内调用以下代码: 问题是有时我会在页面真正加载之前得到时间结果(即我获得50ms次),因此我猜想控件在完成之前会移交给下一条指令。 我应该怎么做才能改善这项测试? 编辑: 正如user1258245所建议的那样,我可以等待元素加载,但是问题是我不知道哪些页面需要预先加载。 问题答
问题内容: 我正在尝试以编程方式测试网站列表的加载时间。目的是大致模拟用户将感知的页面加载时间。 我的第一种方法是在循环内调用以下代码: 问题是有时我会在页面真正加载之前得到时间结果(即,我得到50ms次),所以我猜想控件在完成之前会交给下一条指令。 我应该怎么做才能改善这项测试? 编辑: 正如user1258245建议的那样,我可以等待元素加载,但是问题是我不知道哪些页面需要预先加载。 问题答案
本文向大家介绍在WordPress中加载模板文件的正确方法,包括了在WordPress中加载模板文件的正确方法的使用技巧和注意事项,需要的朋友参考一下 从WordPress 3.0开始,有一个名为的函数get_template_part(),该函数已在新的二十零默认WordPress主题中使用了很多。这是通过使用诸如get_header()包含header.php文件之类的功能来包含部分主题的通常
这是很好的,但我有一些现有的类仍然设置为以旧的方式加载属性: 在将spring cloud Consult的依赖项添加到我的项目后,我收到了新的错误,指出所有这些属性都无法解析。我认为这是因为spring boot看到了Consult依赖项,并且现在忽略了yml文件或其部分内容。 有没有一种方法可以在不更改类中的任何代码的情况下从consul加载这些属性?还是需要更改这些类来遵循使用对象的示例?