2014-01-16 17 views
0

制定者在我UIView子類.H:getter和對UIView的

@interface MyView : UIView 
@property (nonatomic, strong) UIImageView *imageView; 
@end 

我設置了我的UIView子類UIImageView像這樣(init法):

self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 0, 34, 34)]; 
self.imageView.layer.cornerRadius = CGRectGetWidth(imageView.frame)/2.0f; 
self.imageView.layer.masksToBounds = YES; 
self.imageView.backgroundColor = [UIColor someColor]; 
[self addSubview: self.imageView]; 

所以,我可以做myView.imageView.image = [UIImage someImage],它正確設置了UIImageView的圖像。我試圖清理我的UIView子類中的代碼時出現問題。

我試圖做到這一點:

- (UIImageView *)imageView { 
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(5, 0, 34, 34)]; 
    imageView.layer.cornerRadius = CGRectGetWidth(profilePhotoImageView.frame)/2.0f; 
    imageView.layer.masksToBounds = YES; 
    imageView.backgroundColor = [UIColor redColor]; 

    return imageView; 
} 

,然後從init方法做

[self addSubView: [self imageView]];

但是當我做myView.imageView.image = [UIImage someImage]圖像不上的UIImageView顯示。

我忘了什麼?

+1

你能告訴你的執行'imageView' getter方法的休息嗎? – Gavin

+0

請參閱我的回答,瞭解如何根據更新後的問題更改解決問題的方法。 – Gavin

+1

必須檢查ivar是否已經被初始化或者沒有...如果不只是像if(!_ imageView){_ imageView = [UIImageView alloc] init]那樣創建;} –

回答

1

確保您的imageView getter方法獲取已存儲在實例變量_imageView中的UIImageView實例。否則,每次調用imageView方法時,都會創建一個UIImageView的新實例,因此您不會在實際添加到視圖中的實例上設置圖像。

所以,這裏是你的imageView方法應該是什麼樣子:

- (UIImageView *) imageView { 
    UIImageView *imageView = _imageView; 
    imageView.layer.cornerRadius = CGRectGetWidth(profilePhotoImageView.frame)/2.0f; 
    imageView.layer.masksToBounds = YES; 
    imageView.backgroundColor = [UIColor redColor]; 

    return imageView; 
} 
+0

因此,實例變量應該已經被初始化了? –

+1

您也可以將初始化'UIImageView'的代碼移動到您的'imageView' getter方法中,以便它根本不需要初始化。這將是懶惰的實例化。 – Gavin

+1

重要的是要記住,如果您確實需要進行懶惰實例化,那麼您只創建一個新的「UIImageView」(如果它尚未創建)。所以你需要在創建一個新的參數之前進行一次檢查,比如「if(!_imageView)」。 – Gavin

0

當您爲方法imageView命名時,它會覆蓋屬性的getter。所以每次調用它時,都會調用該方法並創建一個新的UIImageView。

IE,

myView.imageView 

[myView imageView] 

兩個調用,它返回一個新的UIImageView,而不是你在init產生的你所定義的方法。