Ios 使用带有情节提要的自定义视图而不添加两次

Ios 使用带有情节提要的自定义视图而不添加两次,ios,iphone,objective-c,Ios,Iphone,Objective C,我正在使用故事板并尝试为不同的ViewController重用一个视图 为此,我创建了一个custom.xib(MyCustomView.xib)和类(MyCustomView),就像建议的那样 在我的故事板中,我将自定义视图设置为类型MyCustomView 在MyCustomView.xib中,将第一响应者设置为MyCustomView 在MyCustomView.m中,我添加了以下方法: -(id)initWithCoder:(NSCoder *)aDecoder{ if ((se

我正在使用故事板并尝试为不同的ViewController重用一个视图

为此,我创建了一个custom.xib(
MyCustomView.xib
)和类(
MyCustomView
),就像建议的那样

在我的故事板中,我将自定义视图设置为类型
MyCustomView

MyCustomView.xib
中,将第一响应者设置为
MyCustomView

MyCustomView.m
中,我添加了以下方法:

-(id)initWithCoder:(NSCoder *)aDecoder{
    if ((self = [super initWithCoder:aDecoder])){
        UIView *myCustomView = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];
        [self addSubview: myCustomView];
    }
    return self;
}
问题是,
[self addSubview:myCustomView]
将一个新的
myCustomView
添加到现有的
myCustomView
,因此该视图被添加了两次

我怎样才能摆脱其中的一个呢

编辑

我的问题不是很清楚,所以我认为一些屏幕帽会有所帮助

这是我的带有自定义视图的故事板。自定义类设置为
MyCustomView

(我还添加了灰色背景和标签,仅供测试使用)

现在,在
MyCustomView.xib
中,我将文件的所有者设置为类
MyCustomView

并为标题标签和图像视图添加插座:

使用上面编写的initWithCoder方法,这可以正常工作,除非在调试时我可以看到: 因此,
self
当然是故事板中选择的类型
MyCustomView
,但它包含两个子视图:

  • 首先是我故事板上的测试标签
  • 第二个是来自
    MyCustomView.xib
    的视图,它本身包含一个标签和图像视图这就是我想要摆脱的观点
  • 什么是自我

    这里是您刚刚实例化的MyCustomView。因此,您正在向由initWithCoder方法创建的新MyCustomView实例添加一个新的UIView(而不是MyCustomView)

    initWithCoder是加载情节提要视图时调用的方法

    如果要在MyCustomViewController中实例化新的MyCustomView,必须调用

    MyCustomView *newInstance = [[MyCustomView alloc] init];
    [self addSubview:newInstance];
    
    其中self是故事板中MyCustomViewController的实例


    编辑

    好的,我更了解你的问题。 如果要加载MyCustomView nib文件,则不需要为其创建类(除非您想在其中访问特定变量)。 只需执行您在此处执行的操作,但在视图控制器中,这将是自:

    您可能想看看:


    编辑2

    好的,我想我明白了:

    • 删除情节提要中的MyCustomView
    • 创建一个类MyView或任何附加到故事板中名为“view”的视图的对象
    • 在类的init方法中,实例化MyCustomView nib
    • 将生成的UIView添加到视图堆栈中,就像您所做的那样
    self将是MyView(出现在脚本中),MyCustomView不会出现在脚本中,而是在MyView.h的init方法中以编程方式创建的


    您必须以编程方式添加约束。这里有一个帖子可能会有所帮助:

    是的,很抱歉,我正在向MyCustomView添加一个新的UIView。但如何摆脱这种特殊的UIView呢?因为在my.xib文件中,它表示MyCustomView。。。谢谢简化:-)如果您在XCode中开始一个新项目,默认视图将是脚本中的UIView类型。如果希望它是MyCustomView类型,只需在右侧面板(第三个选项卡->自定义类)中键入即可。不要在自定义视图类的init中实例化新视图。如果你想在别处实例化一个新的视图,就像我在这个答案中写的那样。我用屏幕上的大写字母编辑了我的问题,因为我担心它不是很清楚。我有特定的变量,所以我需要一个类。另外,我喜欢我的方法,因为我不需要在我的视图控制器中添加任何代码(它只由情节提要和我的小部件视图来处理)。你到底想做什么?因为这段代码:“UIView*myCustomView=[[NSBundle mainBundle]loadNibNamed:@“myCustomView”所有者:self选项:nil]objectAtIndex:0];[self addSubview:myCustomView];”很好地完成了您要求他完成的任务-将myCustomView的新实例添加到myCustomView的现有(自)实例中!是的,这就是为什么我试图将MyCustomView xib的子视图和约束添加到MyCustomView的现有(自身)实例中,但没有成功。另一种方法是在情节提要中完成这一切——在一个控制器中创建自定义视图,然后可以将其复制并粘贴到其他控制器中(在粘贴之前,先删除它们的默认视图)。这可能更容易,但每次我在控制器中修改视图时,都必须在彼此中修改它,这就是为什么我希望它在.xib文件中。