2013-11-14 70 views
0

我有一個簡單的tableView有20行。我創建了一個子類自定義的UITableview單元格,並在cellforRowAtIndex中,我每隔一行添加一個文本字段到該單元格一行。當我滾動上下文本字段出現在錯誤的行。請注意,我無法使UItextfield成爲我自定義單元格的一部分,因爲這可以是任何內容,複選框,單選按鈕,但爲了簡單起見,我選擇了UITextfield ...我做錯了什麼?UITableViewCell可重用性

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
    { 
    static NSString *CellIdentifier = @"TestCellIdentifier"; 
    testCell *cell = (testCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
if(!cell) 
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
else{ 

    //HMMM I also tried removing it before adding it- it doesn't work neither 
    for(UIView *v in cell.subviews){ 
     if(v.tag == 999){ 
      [v removeFromSuperview]; 
     } 
    } 

    //add UItextField to row if it's divisible by 3 
    if(indexPath.row %3 ==0){ 

     UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(400, 10, 300, 30)]; 
     textField.borderStyle = UITextBorderStyleRoundedRect; 
     textField.font = [UIFont systemFontOfSize:15]; 
     textField.placeholder = [NSString stringWithFormat:@"%d",indexPath.row]; 
     textField.autocorrectionType = UITextAutocorrectionTypeNo; 
     textField.keyboardType = UIKeyboardTypeDefault; 
     textField.returnKeyType = UIReturnKeyDone; 
     textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
     textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
     textField.tag = 999; 

     [cell addSubview:textField]; 
    } 
} 


cell.textLabel.text = [NSString stringWithFormat:@"%d",indexPath.row]; 


return cell; 
} 

回答

0

不使用可重用性? 在這個場景中,我不會使用可重用性

+0

是的,我是有工作沒有可重複使用的電池,我只是擔心,它是沒有效率的,但我的表不會超過25排,所以我認爲我可能會很好。謝謝 – IronMan1980

0

重複使用單元格是件好事,你應該可以做到。

你可以考慮從細胞中移除文本字段當它離屏幕,它是排隊等待進行再利用,在委託協議方法:

– tableView:didEndDisplayingCell:forRowAtIndexPath: 

知道行號,你會知道是否要刪除文本框。


編輯補充解釋:

乍一看你的代碼看起來不錯,所以我做了一個小測試項目。 您的原始代碼的問題是您將文本字段添加到錯誤的「視圖」 - UITableViewCells有一些您需要注意的結構。查看UITableViewCell contentView屬性的文檔。它說,部分:

如果你想通過簡單地增加額外的觀點來定製細胞,你 應該將它們添加到內容視圖,以便它們將被適當地定位 作爲細胞轉入和轉出的編輯模式。

因此,代碼應該添加到並列舉細胞的內容查看的子視圖:

for(UIView *v in cell.contentView.subviews){ 
     if(v.tag == 999){ 
      [v removeFromSuperview]; 
     } 
    } 
... 
    textField.tag = 999; 
    [cell.contentView addSubview:textField]; 
+0

我沒有試過這個,我會讓你知道的。 – IronMan1980

+0

我無法讓這停止在單元格中重新創建文本框。如果(v.tag == 999){v removeFromSuperview];則將其放入(UIView * v in cell.subviews){if } }在「didEndDisplayingCell」中,但我永遠無法輸入這個「if」語句。 – IronMan1980

+0

我編輯了我的答案,以提供您的問題的解釋。 –