init set layoutSubviews cell的hidden

我們在view編寫的過程中,經(jīng)常的實用這三個方法,在init中初始化,在set中給view賦值,在layoutSubviews 給view布局. 這樣做的道理是init 在一個控件創(chuàng)建過程中,他上面的子view只會創(chuàng)建一次,比如:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UILabel *label = [[UILabel alloc] init];
        [self addSubview:label];
    }
    return self;
}
這樣可以保證label 只創(chuàng)建一次 畢竟init 只調(diào)用一次

如果在set 和 layout的中創(chuàng)建,會因為多次調(diào)用,會不停地創(chuàng)建,同時設(shè)置屬性也是,寫到set和layout中會浪費性能,這在cell的復(fù)用中尤為明顯,

- (void)setStatus:(YYStatus *)statuses
{
    UILabel *label = [[UILabel alloc] init];
    [self addSubview:label];
}
這個賦值方法, 每個cell都會調(diào)用,所以label會被循環(huán)利用的cell多次創(chuàng)建,多次添加,修改屬性也會被多次修改,造成浪費,因為cell是循環(huán)利用的,不會再調(diào)用init, 所以label只會被創(chuàng)建一次,在layoutSubviews里面的道理是一樣的

Cell 針對有的控件有時候顯示,有時候不顯示(一直顯示的不用判斷hidden)

因為牽扯循環(huán)利用,cell中顯示的控件要全部創(chuàng)建,然后通過是否hidden 來判斷是否隱藏.

特別注意:cell上的每個控件都要在set賦值的時候判斷是否隱藏,包擴(kuò)view上可能顯示,也可能不顯示的子view

例如

 for (int i = 0; i <photos.count; i++) {
        UIImageView  *imageView = [[UIImageView alloc] init];
        imageView.image = ...
    }

這樣判斷,如果photos.count == 5 那么剩余的四個圖片 會復(fù)用前面的圖片,因為你沒對后面的是否hidden進(jìn)行判斷

正確寫法

  // 遍歷所有的圖片控件,設(shè)置圖片
    for (int i = 0; i<self.subviews.count; i++) {
        HWStatusPhotoView *photoView = self.subviews[i];
        
        if (i < photosCount) { // 顯示
            photoView.photo = photos[i];
            photoView.hidden = NO;
        } else { // 隱藏
            photoView.hidden = YES;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容