Не удается получить доступ к свойствам подкласса - PullRequest
0 голосов
/ 18 июля 2011

Я создал следующий подкласс для создания пользовательского чертежа:

//  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;
}

1 Ответ

2 голосов
/ 18 июля 2011

В вашем методе documentIconWithFrame:... вы используете локальную переменную (filenameLabel), которую вы добавляете в представление. Это означает, что ваша переменная экземпляра никогда не создается и всегда nil.

Просто измените это:

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

к этому:

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

и то же самое для других переменных экземпляра.

...