2011-07-18 39 views
0

我已經創建了下面的子類做一些自定義繪製的子類的屬性:無法訪問

// DocumentIconView.h 

@interface DocumentIconView : UIView 
{ 
    UIImageView  *documentIconView; 
    CloseHandle  *closeHandle; 
    UILabel   *filenameLabel; 
} 

@property (nonatomic, strong) UIImageView *documentIconView; 
@property (nonatomic, strong) CloseHandle *closeHandle; 
@property (nonatomic, strong) UILabel *filenameLabel; 

+ (DocumentIconView *)documentIconWithFrame:(CGRect)viewFrame 
        previewImage:(UIImage *)previewImage 
          title:(NSString *)title; 

這非常適用於大部分(我可以實例化對象,並進行自定義圖),但是,我不能訪問其他類的一些屬性。

DocumentIconView *iconView = [DocumentIconView documentIconWithFrame:frame 
                 previewImage:[UIImage imageNamed:@"GenericDocumentIcon.png"] 
                  title:[NSString stringWithFormat:@"test"]]; 

iconView.backgroundColor = [UIColor lightGrayColor]; // this works 
iconView.filenameLabel.backgroundColor = [UIColor darkGrayColor]; // this does not work - no error message 
[documentsView addSubview:iconView]; 

我可以讀取和寫入第一級屬性,但不能進行更深入的;當試圖讀取屬性時,返回的值是(null)

我在子類化方面相當新,所以我想我在這裏錯過了一些非常明顯的東西。任何幫助將不勝感激。

編輯:在問題實例視圖的方法:

+ (DocumentIconView *)documentIconWithFrame:(CGRect)viewFrame 
        previewImage:(UIImage *)previewImage 
          title:(NSString *)title 
{ 
    DocumentIconView *view = [[DocumentIconView alloc] initWithFrame:viewFrame]; 

    // Close handle's size is assigned here 
    CGSize closeHandleSize = CGSizeMake(27, 27); 

    // The document preview image's frame is calculated by shrinking it by the close handle's size 
    CGRect documentPreviewFrame = CGRectMake(closeHandleSize.width/2, 
              closeHandleSize.height/2, 
              viewFrame.size.width - closeHandleSize.width, 
              viewFrame.size.height - closeHandleSize.height - 20); // 20 points is the filenameLabel's height 

    UIImageView *documentPreviewView = [[UIImageView alloc] initWithFrame:documentPreviewFrame]; 
    documentPreviewView.contentMode = UIViewContentModeScaleAspectFit; 
    documentPreviewView.backgroundColor = [UIColor clearColor]; 
    documentPreviewView.image = previewImage; 

    [view addSubview:documentPreviewView]; 

    CGRect closeHandleFrame = CGRectMake(0, 0, closeHandleSize.width, closeHandleSize.height); 
    CloseHandle *closeHandleView = [[CloseHandle alloc] initWithFrame:closeHandleFrame]; 

    closeHandleView.alpha = 0.0; 
    closeHandleView.tag = kCloseHandleTag; 
    [view addSubview:closeHandleView]; 

    CGRect filenameFrame = CGRectMake(0, 
             viewFrame.size.height - 20, 
             viewFrame.size.width, 
             20); 
    UILabel *filenameLabel = [[UILabel alloc] initWithFrame:filenameFrame]; 
    filenameLabel.backgroundColor = [UIColor clearColor]; 
    filenameLabel.text = title; 
    filenameLabel.font = [UIFont boldSystemFontOfSize:17]; 
    filenameLabel.textColor = [UIColor whiteColor]; 
    filenameLabel.textAlignment = UITextAlignmentCenter; 
    [view addSubview:filenameLabel]; 

    view.tag = kDocumentIconTag; 

    return view; 
} 
+0

[iconView.filenameLabel setBackgroundColor:[UIColor darkGrayColor]]; –

+0

謝謝,但問題不在於_that_方法。沒有任何屬性可以被訪問/修改。 – antalkerekes

+0

@property(nonatomic,retain)UIImageView * documentIconView;更改爲保留全部 –

回答

2

在你documentIconWithFrame:...方法您使用的是您要添加到視圖的局部變量(filenameLabel)。這意味着你的實例變量永遠不會被實例化,並且始終是nil

只要改變這一點:

UILabel *filenameLabel = [[UILabel alloc] initWithFrame:filenameFrame]; 

這樣:

filenameLabel = [[UILabel alloc] initWithFrame:filenameFrame]; 

與同爲其他實例變量。

+0

哇。我完全忽略了這一點..你說得對,那就是問題所在。 – antalkerekes