UIView 类别 - 自定义方法不返回 UIView
Posted
技术标签:
【中文标题】UIView 类别 - 自定义方法不返回 UIView【英文标题】:UIView Category - custom method not returning a UIView 【发布时间】:2012-06-15 18:40:40 【问题描述】:我在 UIView 上创建了一个类别,该方法旨在创建和返回 UIView 对象。它运行没有错误,但返回一个空的 UIView。代码如下:
#import <UIKit/UIKit.h>
@interface UIView (makeTableHeader)
-(UIView *) makeTableHeader:(NSString *)ImageName
withTitle:(NSString *)headerTitle
usingFont:(NSString *)fontName
andFontSize:(CGFloat)fontSize;
@end
这是实现:
-(UIView *) makeTableHeader: (NSString *)ImageName
withTitle:(NSString *)headerTitle
usingFont:(NSString *)fontName
andFontSize:(CGFloat)fontSize
// Create a master-view:
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 34)];
// Create the Image:
UIImageView *headerImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:ImageName]];
headerImageView.frame = CGRectMake(0, 0, 320, 34);
// Now create the Header LABEL:
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 320, 34)];
headerLabel.text = headerTitle;
headerLabel.font = [UIFont fontWithName:fontName size:fontSize];
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.textColor = [UIColor whiteColor];
headerLabel.shadowColor = [UIColor blackColor];
headerLabel.shadowOffset = CGSizeMake(1.0, 1.0);
// Finally add both both Header and Label as subview to the main Header-view:
[headerView addSubview:headerImageView];
[headerView addSubview:headerLabel];
return headerView;
现在我是这样称呼这个类别方法的:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
UIView *hView = [[UIView alloc] init];
[hView makeTableHeader:@"redGradientHeader5@2x.jpg"
withTitle:@"Test Banner"
usingFont:@"boldSystemFont"
andFontSize:18];
return hView;
代码运行良好 - 但我得到一个空视图。有趣的是,它确实 size 正确地查看了视图 - 给它我要求的 CGRect 坐标 - 但视图内没有图像或标签。
有人知道怎么回事吗?
【问题讨论】:
【参考方案1】:您需要将该方法设为class
方法,并像这样分配它:
UIView *hView = [UIView makeTableHeader:@"redGradientHeader5@2x.jpg"
withTitle:@"Test Banner"
usingFont:@"boldSystemFont"
andFontSize:18];
您正在创建两个视图 - 一个使用 alloc/init,一个使用您的自定义函数。但是,您只是将 first 分配给hView
。这是因为在makeTableHeader
方法中,您使用hView
创建 second UIView,并将子视图/修改应用于 而不是修改hView
。这个视图然后由方法返回,然后立即丢弃,因为它没有分配给任何东西。
或者,如果你坚持保留它是一个实例方法并修改视图,你只需要这样做(虽然我强烈 不建议):
-(void) makeTableHeader: (NSString *)ImageName
withTitle:(NSString *)headerTitle
usingFont:(NSString *)fontName
andFontSize:(CGFloat)fontSize
//you may want to remove all subviews here or something
// Create the Image:
self.frame = CGRectMake(0, 0, 320, 34);
UIImageView *headerImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:ImageName]];
headerImageView.frame = CGRectMake(0, 0, 320, 34);
// Now create the Header LABEL:
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, 320, 34)];
headerLabel.text = headerTitle;
headerLabel.font = [UIFont fontWithName:fontName size:fontSize];
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.textColor = [UIColor whiteColor];
headerLabel.shadowColor = [UIColor blackColor];
headerLabel.shadowOffset = CGSizeMake(1.0, 1.0);
// Finally add both both Header and Label as subview to the main Header-view:
[self addSubview:headerImageView];
[self addSubview:headerLabel];
【讨论】:
this WORKS :-) (我标记为正确答案)但我想知道:为什么您如此强烈反对将其设为实例方法?如果您的方法的目的是创建并返回一个对象,那么您是否使用 Class 方法?因为我见过很多创建和返回对象的 instance 方法。你能解释一下吗?Factory
方法(用于创建实例的方法)应该始终是类方法,因为这样您就可以避免为了创建 second 而必须创建实例的开销您想要的实例。 例外情况是如果您希望新实例部分基于旧实例。以上是关于UIView 类别 - 自定义方法不返回 UIView的主要内容,如果未能解决你的问题,请参考以下文章
UIGesture 返回 UIImageView 而不是自定义视图
在 UIViewController 的主视图中加载自定义 UIView
自动布局:使用 UIWebViews 自定义 UIView 高度约束
如何为自定义 TableViewCell 和 CollectionView Cell 使用一个 UIView。?