0

我有这段代码,BGBaseSnippetCode.h

static NSMutableDictionary * defaultHeightDictionary= nil;
static NSMutableDictionary * defaultBoundsDictionary =nil;

+(void)initialize
{
    BGBaseTableViewCell * typical = [[self alloc]init];

    if (defaultHeightDictionary==nil) {
        defaultHeightDictionary = [NSMutableDictionary dictionary];
        defaultBoundsDictionary = [NSMutableDictionary dictionary];
    }
    [defaultHeightDictionary setValue:@(typical.bounds.size.height) forKey:NSStringFromClass([self class])];
    CGRect bounds = typical.bounds;

    NSValue * boundsValue = [NSValue valueWithCGRect:bounds];
    [defaultHeightDictionary setValue:boundsValue forKey:NSStringFromClass([self class])];


}

+(CGFloat) defaultHeight
{
    NSNumber * result = [defaultHeightDictionary valueForKey:NSStringFromClass([self class])];
    return result.floatValue;
}

+(CGRect) defaultBounds
{
    NSValue * result = [defaultBoundsDictionary valueForKey:NSStringFromClass([self class])];
    return [result CGRectValue];
}

我想在BGBaseOfAllUIControl.m和中都插入这个BGBaseTableViewCell.m。所以我只是尴尬地这样做了:

@interface BGBaseOfAllUIControl ()
@property (strong, nonatomic) IBOutlet UIView *view;
@end
@implementation BGBaseOfAllUIControl

#import "BGBaseSnippetCode.h"

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self BaseInitialize];
    }

@interface BGBaseTableViewCell ()
@property (strong, nonatomic) IBOutlet UITableViewCell *view;

@end
@implementation BGBaseTableViewCell

//static BOOL isDefaultHeightSet = NO;

#import "BGBaseSnippetCode.h"

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self BaseInitialize];
    }
    return self;

基本上两者都BGBaseOfAllUIControl共享BGBaseTableViewCell相同的协议,我希望完全相同的代码为双方实现协议。BGBaseTableViewCell是 的子类并且UITableViewCellBGBaseOfAllUIControl的子类UIControl

所以我使用 .h 文件来包含一些实现。代码工作正常。只是尴尬。有什么更好的方法来做到这一点,或者我这样做对吗?

4

1 回答 1

2

我会忘记所有标题导入和静态字典技巧,并引入一个单独的类来处理您需要的布局信息。就像是:

@interface BGTableLayoutInfo
- (float) defaultHeightForClass: (Class) tableViewType;
- (CGRect) defaultBoundsForClass: (Class) tableViewType;
@end

在实现中,您将拥有一个常规(非静态)字典,用于缓存不同类的布局信息。剩下的唯一问题是表格视图对象将如何获取布局类的实例。一种可能性是使布局信息方法静态(使用静态缓存字典),第二种是通过+defaultLayoutInfo方法保持共享实例可访问。

于 2012-12-06T08:05:35.007 回答