2012-06-15 51 views
2

我創建了一個UIView上的類別與方法誰的目的是創建並返回一個UIView對象。它運行時沒有錯誤,但返回一個空的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:@"[email protected]" 
       withTitle:@"Test Banner" 
       usingFont:@"boldSystemFont" 
       andFontSize:18]; 

    return hView; 

}

的代碼運行正常 - 但我得到一個空的看法。有趣的是,它確實正確地顯示了大小的視圖 - 爲它提供了我要求的CGRect座標 - 但視圖內沒有圖像或標籤。

任何人看到有什麼問題?

回答

6

你需要做的方法class方法,並將其分配是這樣的:

UIView *hView = [UIView makeTableHeader:@"[email protected]" 
      withTitle:@"Test Banner" 
      usingFont:@"boldSystemFont" 
      andFontSize:18]; 

您正在兩種觀點 - 一個與分配/初始化,以及一個與您的自定義功能。但是,您只會將第一個一個分配給hView。這是因爲在makeTableHeader方法,使用的是hView創建一個的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]; 

} 
+0

這工作:-)(我標記爲正確的答案)但我想知道:爲什麼你如此強烈反對使它成爲實例方法?如果你的方法的目的是**創建**並返回一個你用Class方法去的對象,那麼這是一個普遍的經驗法則嗎?因爲我見過大量的**實例**方法來創建和返回對象。你能對此有所瞭解嗎? – sirab333

+1

'Factory'方法(用於創建實例的方法)應該始終是類方法,因爲這樣可以避免必須創建實例以創建* second *實例(這是您想要的實例)的開銷。 **這個**的例外情況是,如果您希望新實例部分基於舊實例。 – CrimsonDiego

+0

明白了 - 很好的解釋 - 謝謝:-) – sirab333