2

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;

}

コードは正常に実行されますが、空のビューが表示されます。興味深いことに、ビューのサイズは正しく設定されており、要求したCGRect座標が与えられていますが、ビュー内に画像やラベルはありません。

誰かが何が悪いのかわかりますか?

4

1 に答える 1

6

classメソッドをメソッドにして、次のように割り当てる必要があります。

UIView *hView = [UIView makeTableHeader:@"redGradientHeader5@2x.jpg"
             withTitle:@"Test Banner"
             usingFont:@"boldSystemFont"
           andFontSize:18];

2つのビューを作成しています。1つはalloc/initを使用し、もう1つはカスタム関数を使用します。ただし、最初のものをに割り当てるだけですhView。これは、このmakeTableHeaderメソッドでは、を使用hViewして2番目の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];

}
于 2012-06-15T18:42:04.643 に答える