Objective c 自定义初始化的子类UIView-这是否正常?

Objective c 自定义初始化的子类UIView-这是否正常?,objective-c,uiview,Objective C,Uiview,我一直在寻找创建定制的、可重用的视图组件的最佳实践和其他方法。到目前为止,定制UIView子类似乎是一个不错的选择 在这种情况下,我所需要的是一个固定大小的视图,可以方便地访问标签,一个方便的初始值设定项就很好了。我可以标记标签并使用常量,但考虑到这一点(类似UIKit导入的样板文件已删除)(带ARC),它似乎没有必要: (编辑:改为类方法。我的关注点仍然没有改变,尽管总体上没有那么可疑) My MyView.xib文件唯一的顶级元素(UIView)将自定义类设置为MyView,并且出口连接到文

我一直在寻找创建定制的、可重用的视图组件的最佳实践和其他方法。到目前为止,定制UIView子类似乎是一个不错的选择

在这种情况下,我所需要的是一个固定大小的视图,可以方便地访问标签,一个方便的初始值设定项就很好了。我可以标记标签并使用常量,但考虑到这一点(类似UIKit导入的样板文件已删除)(带ARC),它似乎没有必要:

(编辑:改为类方法。我的关注点仍然没有改变,尽管总体上没有那么可疑)

My MyView.xib文件唯一的顶级元素(UIView)将自定义类设置为MyView,并且出口连接到文件所有者

而且。。。这很有效。完美地它在我使用它的任何地方都能正确渲染,没有异常,没有剪辑,没有我能看到的有趣的事情

到目前为止。我有点担心:

  • 我还没有在任何地方见过这种技术。当然,我只是在寻找一个相对较短的时间(被动的几个小时)
  • 我没有执行任何建议重写initWithFrame:/Coder:等的操作
  • 我现在只在一个非常有限的领域中使用它,所以它在视图消失、绘图性能未知、内存泄漏等情况下几乎没有得到很好的测试
  • 我几乎可以肯定我错过了什么。我很可能会在更多地使用它的同时很快找到它,但我可能不会找到所有的

  • 有没有比我更有经验的人愿意把他们的大脑借给我一点?这是个好主意吗?一个可怕的“天哪,你在想什么”的主意?有惊喜等着我吗?关于如何创建这样的简单自定义视图,我是否应该阅读一些内容?

    您应该阅读,还有。初始化者并不难,但是有一些微妙的问题可能会困扰你,正如你在评论中已经提到的那样,你可以从你当前的代码中发现。

    一般来说,这种技术应该是好的。由于您将类方法作为“方便的初始值设定项”调用,
    self
    引用类对象,并且不会更改,因此可以在那里引用它。这并不像在初始值设定项中旋转self,这更复杂,但可以正确完成


    在上面的例子中,当您从Nib加载视图时,只会调用
    initWithCoder:
    初始值设定项。

    第一行中“self”的三个用法实际上非常可怕,特别是因为您更改了self,并且没有释放旧的self。更不用说nib中使用“文件所有者”的任何内容都会让人大吃一惊。作为一个类方法,它可能更有意义。哈,这是一个很好的观点——尤其是所有者:case。事实上,我想我现在就改变。改变-谢谢:)这是漫长的一天,我可能没有完全正确地思考。这更有意义。我没有看到任何特别可疑的东西--
    [self class]
    可以改为
    self
    ,而
    +with text:
    这个名字不是很地道,但仅此而已。再次感谢[self class]——我想这在类方法中是不必要的。我会把这个问题留待讨论,以防其他人有其他事情需要我去处理:)
    // .h file
    @interface MyView : UIView
    @property (nonatomic, weak) IBOutlet UILabel *label;
    + (id)withText:(NSString *)text;
    @end
    
    // .m file
    @implementation MyView
    + (id)withText:(NSString *)text {
        MyView *view = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])
                                                      owner:nil
                                                    options:nil] objectAtIndex:0];
        view.label.text = text;
        return view;
    }
    @end