当前位置: 首页 > 知识库问答 >
问题:

为UIView子类加载Nib的正确方法

邓德本
2023-03-14

我知道以前有人问过这个问题,但答案是矛盾的,我很困惑,所以请不要炒我鱿鱼。

我希望在整个应用程序中有一个可重用的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吗?还是我所做的一切都还可以?

共有3个答案

庄欣然
2023-03-14

遵循以下步骤

将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。。

演示我在这里做了一个演示抓取

百里杰
2023-03-14

如果您想保持您的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]

章昆琦
2023-03-14
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加载这些属性?还是需要更改这些类来遵循使用对象的示例?