2014-02-13 68 views
-1

我創建了我自己的CustomTableViewCustomCell。該小區在xib,以及初始化時的tableView,這樣我對其進行註冊:UITableViewCell的初始化在哪裏?

[self registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] 
        forCellReuseIdentifier:kCustomCellIdentifier]; 

如果我不這樣做,我將無法界定什麼ReuseIdentifier應該「點」這個班。這是我的cellForRow

-(UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [self dequeueReusableCellWithIdentifier: 
         kCustomCellIdentifier forIndexPath:indexPath]; 

    if(!cell) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"CustomCell" 
         owner:self options:nil] objectAtIndex:0]; 

     cell.delegate = self; 
     [cell initialSetup]; //Other stuff 
    } 
    else 
     [cell resetCell]; 

    //And other awesome stuff 

    return cell; 
} 

This'works'。當我推出我的應用程序時,我自己的自定義單元格正在顯示。 但是,事實證明,細胞從未從[self dequeue..返回nil。因此,if語句if(!cell)從來就不是真的。我在這個陳述中還有一些額外的設置,我想要執行,但是我不知道現在第一次單元的初始化位置在哪裏。如果我刪除registerNib,那麼這個說法是真實的,但是對於所有單元來說都是如此,並且沒有一個將會出列。

我大概可以解決這個問題,並將我的initialSetup(和其他東西)放在CustomCell類中的-(id)initWithCoder..-方法中,但我想知道我的單元格現在正在初始化的位置。爲什麼我的細胞在cellForRowAtIndexPath之前存在?

+0

是否使用'storyboard'幫助? – Akhilrajtr

+0

@Akhilrajtr是的。 – Sti

+0

然後'if(!cell)'不會是真的,因爲'dequeueReusableCellWithIdentifier'返回一個單元格。在'CustomCell'中使用'awakeFromNib'方法 – Akhilrajtr

回答

0

使用dequeueReusableCellWithIdentifier: forIndexPath:時,如果您使用的是默認值UITableViewCell,則不需要像這樣分配單元格。在您的自定義UITableViewCell子類,當它被初始化這個叫做:

- (void)awakeFromNib { 
    [super awakeFromNib]; 
} 

所以補充一點,在那裏,你應該是好的。

2

當註冊一個類或使用方法registerClass:forCellReuseIdentifierregisterNib:forCellReuseIdentifier所述的tableview如果當調用dequeueReusableCellWithIdentifier:無人可用內部將創建單元的實例在表視圖一個筆尖,所以不再需要內部的初始化代碼代表。

UITableView.h代碼:

// Beginning in iOS 6, clients can register a nib or class for each cell. 
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned. 
// Instances returned from the new dequeue method will also be properly sized when they are returned. 
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0); 
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0); 

取決於其register方法的使用init方法稱爲是:

  • initWithStyle:reuseIdentifier使用registerClass:
  • initWithCoder:爲登記小區登記小區使用registerNib:

如果您使用的是registerNib:,您也可以在單元格中使用awakeFromNib方法,這也是放置單元初始化代碼的好地方。使用initWithCoder:awakeFromNib之間的主要區別在this question中解釋。

當單元格被重新使用時,單元格中的方法prepareForReuse可以在單元格中進行一些清理,並使其準備好再次進行配置。

一個好的方法與所有這個工作將是:

//ViewController code 

- (void)viewDidLoad 
{ 
    ... 
    [_tableView registerNib:[UINib nibWithNibName:@"CellSample" bundle:Nil] forCellReuseIdentifier:@"cellIdentifier"]; 
    ... 
} 

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 
    //configure the new cell, no if (!cell) needed 
    return cell; 
} 


//Cell code 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     //You can put initialization here 
    } 
    return self; 
} 


- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    //But is better initialize here 
} 


- (void)prepareForReuse 
{ 
    //Reuse and reset the cell here 
} 

希望它

0
- (instancetype)initWithStyle:(UITableViewCellStyle)style 
       reuseIdentifier:(NSString *)reuseIdentifier{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
    //custom your cell 
    } 
    return self; 
    } 
+2

通常最好提供一些解釋,以解釋爲什麼,或者除了代碼之外如何回答這個問題。 – Makyen

相關問題