自定义UIView用于在许多ViewControllers上显示标签?

时间:2014-01-26 17:10:40

标签: ios objective-c uiview uilabel

我是Objective-c的新手,这是一个新手问题。 我正在编写一个应用程序,在许多视图上都有这个自定义标签。 (编辑)标签有两个部分:作为标题的主标签和具有一些短文本的较小子标签。 (/编辑) 将标签手动放在所有视图上似乎很愚蠢,所以我开始考虑制作一个由两个标签组成的自定义控件:mainLabelsubLabel。我不确定这里有什么方法更好。我应该制作一个自定义UIView还是有更好的方法呢?

如果自定义UIView是正确的方法,我该如何处理标签的设置?创建一个协议委托会使ViewController实现标签控件初始化方法成为正确的方法吗?

编辑: 我如何重新使用自定义UIView,以便稍后当标签样式发生变化时,我不必分别更改每个样式的外观,而是每次使用自定义UIView时都要使用某种模板

我会在这里提出回答给任何有同样问题的人:

您应该使用自定义UIView控制设置标签(请查看下面的答案)以及.xib文件,该文件将定义标签外观的模板。 如果您对UIView和.xib文件感兴趣,请查看: How to use a xib and a UIView subclass together?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

只需设置一对文本标签,就不需要委托关系。如果要为具有两个标签的视图执行UIView子类,只需将此视图添加到视图控制器,然后在视图子类中,右键一个与UILabel setText:方法类似的方法。它只需要两个参数。

因此,如果mainLabel子类subLabel文件中的UILabelUIView属性为.m,则可能会执行以下操作:

UIView子类的.h文件中:

@interface DoubleLabelView

@property (nonatomic,strong) NSString *mainText;
@property (nonatomic,strong) NSString *subText;

- (void)setText:(NSString*)mainText subText:(NSString*)subText;

@end

然后在.m文件中:

@interface DoubleLabelView()

@property (nonatomic,strong) UILabel *mainLabel;
@property (nonatomic,strong) UILabel *subLabel;

@end

@implementation DoubleLabelView

- (void)setText:(NSString*)mainText subText:(NSString*)subText {
    self.mainText = mainText;
    self.subText = subText;
}

- (void)setMainText:(NSString*)mainText {
    _mainText = mainText;
    self.mainLabel.text = mainText;
}

- (void)setSubText:(NSString*)subText {
    _subText = subText;
    self.subLabel.text = subText;
}

如果自定义视图上标签的位置不变,我建议您只使用.xib文件来准确设置自定义视图的外观。我可能会添加一个自定义工厂方法,该方法接收manTextsubText个参数,并在那时调用setText:subText:

如果你是UIView的子类,则子类中包含的视图特定代码越多越好。


我以相同的方式向UIView添加了方法,允许您在单个方法调用中同时更改mainTextsubText或两者,可以继续添加此类方法来更改UIView的属性。

如果您想重新定位标签,请考虑添加一对CGPoint属性:

@property (nonatomic,assign) CGPoint mainLabelPosition;
@property (nonatomic,assign) CGPoint subLabelPosition;

- (void)setPosition:(CGPoint)mainPosition subPosition:(CGPoint)subPosition;

并为这些方法编写类似于我向您展示的用于更改文本的方法。

答案 1 :(得分:1)

创建UIView的子类,如下所示,

CustomView.h文件

@interface CustomView : UIView
@property UILabel *mainLabel;
@property UILabel *subLabel;

-(void)showMainLabelWithText:(NSString *)text;
-(void)showSubLabel:(NSString *)text;

@end

CustomView.m文件

@implementation CustomView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}
-(void)showMainLabelWithText:(NSString *)text{
    self.mainLabel =[[UILabel alloc] init];
    self.mainLabel.text =text;
    [self addSubview:self.mainLabel];
}
-(void)showSubLabel:(NSString *)text{
    self.subLabel =[[UILabel alloc] init];
    self.subLabel.text =text;
    [self addSubview:self.subLabel];
}