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

Posted

技术标签:

【中文标题】用于在许多 ViewControllers 上显示标签的自定义 UIView?【英文标题】:Custom UIView for displaying a label on many ViewControllers? 【发布时间】:2014-01-26 17:10:39 【问题描述】:

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

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

编辑: 我如何重用自定义 UIView 以便稍后在标签样式更改时,我不必单独更改它们每个的外观,而是要有某种模板,每次使用自定义 UIView 时都会使用

我会将答案放在这里,供有相同问题的人参考:

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

感谢您的帮助!

【问题讨论】:

需要更多细节。标签有什么特别之处? 没有什么真正的习惯。它总是有两个具有一定位置和外观的普通标签。我只是不确定它是否不会在全球范围内发生变化。手动更改每个视图会很痛苦... 你的问题还很不清楚。除了标签上的文字之外,您还想对这些标签进行哪些具体更改? 每个自定义UIViews上标签的位置,例如 好的,我认为 .xib 文件是我需要的。谢谢 nhgrif 【参考方案1】:

您不需要委托关系来简单地设置一对文本标签。如果你想为一个有两个标签的视图创建一个UIView 子类,然后简单地将这个视图添加到你的视图控制器中,然后在你的视图子类中,使用一个类似于UILabel setText: 方法的方法。它只需要两个参数。

因此,如果 mainLabelsubLabel 是您的 UIView 子类的 .m 文件中的 UILabel 属性,您可能会执行以下操作:

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;

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

【讨论】:

好的,我明白了,但是我如何将这个东西放在所有的视图控制器上,这样我就不必在以后更改样式时更改它们? 改变什么?同样,正如我对原始问题的评论,我需要更多细节。你说得太模糊了。 我在对您的评论的评论中询问了这个问题:) 我会编辑这个问题 您从未明确指定要更改的内容。标签是仅在单个视图上的 UI 元素。除了控制它所在的视图的视图控制器之外,它不应该被任何东西改变。 UI 元素不应该是全局性的。【参考方案2】:

如下创建一个 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];

【讨论】:

这将创建两个 UILabel 来使用,这很酷,但是布局呢?如何实现自动化? mainLabel 和 subLabel 是公共属性,只需将它们的框架设置为 instance.mainLabel.frame =someFrame;

以上是关于用于在许多 ViewControllers 上显示标签的自定义 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

在swift中删除viewcontrollers

viewController 在用于 UINavigationController 时从 [tabBarController viewControllers] 数组中移除

ViewControllers MFMailComposer 旋转问题的分段控制

调整 UINavigationController ViewControllers NSArray 的顺序

仅在不切换 viewControllers 的情况下 Segue 动画

将 inputAccessoryView 与多个 UITextField 和 ViewController 一起使用