2014-03-26 19 views
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

    cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row]; 
    cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row]; 

    return cell; 
} 

的初始化子類,這是蘋果的代碼片段Table View Programming Guide涉及哪些問題,分配和定義UITableViewCell

MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];工作正常,並且需要,因爲電池在故事板定義和送花兒給人返回有效的細胞對抗零沒有檢查。

但是,如果我不使用故事板,以編程方式我將如何在我的tableview中使用多個自定義單元格?什麼是參與allocating and initializing MyTableViewCell

回答

1

您應該使用方法

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier 
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier 
的UITableView的

。你可以閱讀文檔here

當你調用的方法

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier 

,它會檢查是否存在重複使用的隊列可用小區。如果不是,它會檢查它是否可以自動創建這個單元格。如果您之前已爲此重用標識符註冊單元類或筆尖,它將使用類或筆尖創建新單元並將其返回。如果你還沒有註冊任何東西,它將返回零。

最好使用註冊,因爲如果您對不同的重用標識符使用不同的自定義單元格,則創建這些單元格的代碼會變得混亂。這也是正確的方法。分別在iOS5和iOS6中添加了註冊方法。程序員創建自定義單元的代碼與舊版iOS相關。

+0

請詳細告訴我們這些方法是如何工作的,爲什麼不分配uitableviewcell的init子類,以及如何找到這些方法:p –

0

問題有,你可以用另外一種方法:

MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"> forIndexPath:indexPath]; 

你傳遞額外的參數 - indexPath。 之後,檢查單元是否爲零,如果是,則分配並初始化它。

+0

我看不到MyTableViewCell的分配和初始化。它將如何工作? –

+0

您檢查它是否爲零,因此您分配並初始化它。 – Greg

0

如果您不使用故事板,那麼您需要檢查單元格是否爲零,如果是,請分配一個新的單元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = @"MyIdentifier"; 
    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 

    cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row]; 
    cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row]; 

    return cell; 
} 
1

您可以使用自己的自定義單元格以這種方式也

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"cell"; 

    MyTableViewCell *cell=(MyTableViewCell *)[self.yourtableview dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:0];//change as per your need 

    if(cell==nil) 
    { 
    [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil]; 
    cell=self.mytableviewcellref; 
    } 
    [email protected]"sometext"; 
    return cell; 
} 

希望它可以幫助你..

+0

@ SJ。您需要在使用自定義單元格的同時加載Nib。 – Vidhyanand

+0

請告訴我爲什麼你沒有分配uitableviewcell的init子類以及這個loadNibNamed是如何工作的? –

+0

您正在將自定義單元格的cell.xib直接連接到您的視圖控制器。所以你可以在這裏加載它的Nib。如果你使用的是默認的UITableViewCell,那麼你必須分配使用它,如果它是零.. @ SJ .. – Vidhyanand

1

如果你想創建細胞編程,那麼你需要分配和初始化表單元格喜歡這個。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 
static NSString *identifier = @"cell"; 

    UITableViewCell *cell = [listtableview dequeueReusableHeaderFooterViewWithIdentifier:identifier]; 

    if (cell ==nil) { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    } 
} 
+0

我正在使用自定義單元格MyTableViewCell,而不僅僅是一個常規單元格。 –

+0

好吧沒問題:)在這種情況下,你必須做一個saprate類的自定義單元格,請檢查這裏的鏈接,你可以找到我們如何添加自定義單元格http://mrmaksimize.com/ios/Custom-UITableViewCell-With-NIB/ – morroko

+0

我想以編程方式執行所有操作,沒有NIB或故事板。 –