用于在许多 ViewControllers 上显示标签的自定义 UIView?
Posted
技术标签:
【中文标题】用于在许多 ViewControllers 上显示标签的自定义 UIView?【英文标题】:Custom UIView for displaying a label on many ViewControllers? 【发布时间】:2014-01-26 17:10:39 【问题描述】:我是 Objective-c 的新手,这是一个新手问题。
我正在编写一个应用程序,它在许多视图上都有这个自定义外观标签。
(编辑)标签有两部分:用作标题的主标签和具有一些短文本的较小子标签。 (/编辑)
在所有视图上手动放置标签似乎很愚蠢,所以我开始考虑制作一个包含两个标签的自定义控件:mainLabel
和subLabel
。我不确定这里哪种方法更好。我应该自定义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:
方法的方法。它只需要两个参数。
因此,如果 mainLabel
和 subLabel
是您的 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
文件来准确设置自定义视图的外观。我可能会添加一个自定义工厂方法,该方法接受 manText
和 subText
参数并立即调用 setText:subText:
。
如果您要对UIView
进行子类化,那么您可以在子类中包含的视图特定代码越多越好。
以同样的方式,我向UIView
添加方法以允许您在单个方法调用中更改mainText
、subText
或同时更改两者,您可以继续添加方法,例如因为这是为了更改您的 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?的主要内容,如果未能解决你的问题,请参考以下文章
viewController 在用于 UINavigationController 时从 [tabBarController viewControllers] 数组中移除
ViewControllers MFMailComposer 旋转问题的分段控制
调整 UINavigationController ViewControllers NSArray 的顺序