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;

基本的に両方が同じプロトコルBGBaseOfAllUIControlBGBaseTableViewCell共有しており、まったく同じコードで両側のプロトコルを実装したいと考えています。はのBGBaseTableViewCellサブクラスでUITableViewCellありBGBaseOfAllUIControl、 のサブクラスですUIControl

そのため、実装を含めるために .h ファイルを使用しています。コードは正常に機能します。ただぎこちない。これを行うためのより良い方法は何ですか、または私はこれを正しく行っていますか?

4

1 に答える 1

2

すべてのヘッダーのインポートと静的辞書のトリックを忘れて、必要なレイアウト情報を処理する別のクラスを導入します。何かのようなもの:

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

実装では、さまざまなクラスのレイアウト情報をキャッシュするための通常の (静的ではない) 辞書があります。唯一残っている問題は、テーブル ビュー オブジェクトがレイアウト クラスのインスタンスを取得する方法です。1 つの可能性は、(静的キャッシング辞書を使用して) レイアウト情報メソッドを静的にすることです。2 つ目は、+defaultLayoutInfoメソッドを介して共有インスタンスにアクセスできるようにすることです。

于 2012-12-06T08:05:35.007 に答える