【问题标题】:Creating custom init method for UIView to add a UILabel为 UIView 创建自定义初始化方法以添加 UILabel
【发布时间】:2014-01-10 23:52:26
【问题描述】:

目前我有一个自定义 UIView 类,它完成了以下操作:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self setupView];
    }
    return self;
}
-(void)setupView {
    self.layer.cornerRadius = 4;
    self.layer.masksToBounds= YES;
    self.backgroundColor = [UIColor whiteColor];
    self.layer.borderWidth = 1;
    self.layer.borderColor = [UIColor lightGrayColor].CGColor;
}

我还有另一个 UIView 类别,它创建一个新的 UIView 并制作它,以便我可以使用以下自动布局:

@implementation UIView (Autolayout)
+(id)autolayoutView
{
    UIView *view = [self new];
    view.translatesAutoresizingMaskIntoConstraints = NO;
    return view;
}

两者都相当简单。我现在想做的是为 UIView 创建一个自定义的 init 方法。

问题
我希望使用自定义 init 方法来创建 UILabel 并将其添加到 UIView。但是,我希望 init 方法使用我已经创建的 UIView 类别?我相信这很简单,只是不知道如何完成?

编辑
目前要创建自定义自动布局视图我调用UIView *myView = [MyCustomViewClass autoLayoutView]
我想做的是更新自定义视图类的 init 方法以创建标签,但仍然以相同的方式调用它,以便使用类别并且我也调用了自动布局信息。

编辑 2
真正有用的是如果我可以传入一个参数来确定UIView 是否应该有UILabel。因此,如果视图应该有标签,则可以调用自定义的 init 方法。我知道创建和添加标签/约束的代码我只是不确定子类/类别链接和创建自定义初始化方法。以及如何与autoLayoutView 调用一起调用?

【问题讨论】:

  • 有点不清楚,您是想从类别中添加标签还是从 init 方法添加标签?你是想从 UIView 类中还是从另一个 Controller 或其他东西中调用类别?
  • @Eric - 我添加了一个编辑,希望能阐明我想要实现的目标。我确信它很简单,但我想完全理解这种方法。
  • 还添加了进一步的编辑来解释我在这里的理解困难和困惑。谢谢

标签: ios objective-c uiview ios7 uilabel


【解决方案1】:

这种方法的问题是您使用通用 UIView 上的类别来创建带有UIView *myView = [MyCustomViewClass autoLayoutView] 的 UIView。

由于它是 UIView 而不是您创建的自定义子类,因此它不会引用您创建的任何自定义 init 方法。所以一种解决方案是......为什么不将所有自定义添加到类别中?

+(id)autolayoutViewWithCustomization:(BOOL)customize addLabel:(BOOL)addLabel
{
    UIView *view = [self new];
    view.translatesAutoresizingMaskIntoConstraints = NO;

    if (customize) {
       view.layer.cornerRadius = 4;
       view.layer.masksToBounds= YES;
       view.backgroundColor = [UIColor whiteColor];
       view.layer.borderWidth = 1;
       view.layer.borderColor = [UIColor lightGrayColor].CGColor;
    }

    if (addLabel) {
       // Create a label here
       [self addSubview:label];
    }

    return view;
}

【讨论】:

    【解决方案2】:

    如果我从您的问题中得到的信息是正确的,那么这就是您想要做的:

    只需使用您已经创建的 init 方法,并在其上添加更多内容。

     +(id)autolayoutViewWithAddedLabel:(BOOL)addedLabel
     {  
         UIView *view = [self new];
         view.translatesAutoresizingMaskIntoConstraints = NO;
    
         if(addedLabel) {
            // do your label stuff here
            [self addSubview://label];
         }
         return view;
     }
    

    那么如果你想调用这个方法,你可以像你对​​问题中的方法所做的那样说

      MyClass *mc = [MyClass autolayoutViewWithAddedLabel:YES];
    

    这会将标签添加到您的自定义视图中

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多