2011-04-30 43 views
1

我有一個tableview有四個部分,所有部分有兩個文本框和一個標籤在不同的行中。我添加了一些文本作爲文本框的佔位符。最初數據顯示正常,但當我滾動tableview時,單元格開始有重疊的數據。
我的代碼:uitableviewcell的數據在滾動上相互重疊

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

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
if(indexPath.row==0) { 
    UITextField *txtName = [[UITextField alloc] initWithFrame:CGRectMake(5, 5, 300, 30)]; 
    txtName.placeholder = @"Full Name"; 
    [cell.contentView addSubview:txtName]; 
    [txtName release]; 
} 
else if(indexPath.row==1) { 
    UITextField *txtEmail = [[UITextField alloc] initWithFrame:CGRectMake(5, 5, 300, 30)]; 
    txtEmail.placeholder = @"Email"; 
    [cell.contentView addSubview:txtEmail]; 
    [txtEmail release]; 
} 
else if(indexPath.row==2){ 
    cell.textLabel.text = @"Select Date of Birth"; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
} 
// Configure the cell... 

return cell; 

}

在此先感謝
潘卡

回答

16

你只需要在代碼inits細胞塊來創建文本字段。請記住,表格視圖可以回收單元格,因此當您從屏幕上滾動時,您將得到一個已經有文本字段的重用單元格。然後,您將創建一個新的文本字段並將新的文本字段覆蓋在現有的文本字段上,因此您會重疊。

這裏是你的代碼重構正確

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     //create the textField here, and we will reuse it and reset its data for each row. 
     UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(5, 5, 300, 30)]; 
     [cell.contentView addSubview:txtField]; 
     txtField.tag=110; //should declare a constant that uniquely defines your textField; 
     [txtField release]; 

    } 

    // Configure the cell... 

    //ok, now we retrieve the textField and set its data according to the row. 
    UITextField *txtField = (UITextField *)[cell.contentView viewWithTag:110]; 

    if(indexPath.row==0) { 
     txtField.placeholder = @"Full Name"; 
    } 
    else if(indexPath.row==1) { 
     txtField.placeholder = @"Email";  
    } 
    else if(indexPath.row==2){ 
     txtField.placeholder = nil; //? did you mean to set something here? 
     cell.textLabel.text = @"Select Date of Birth"; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 


    return cell; 
} 
+0

+1,但如果你在一個行設置accessoryType你應該在其他行禁用它。 – 2011-04-30 17:10:29

+0

嗨賈森,謝謝你的回覆,但textlabel文本出現在第0行也滾動幾次。 – pankaj 2011-04-30 17:58:39

+0

你想讓它隱藏在第0行,並在其他地方可見嗎? – 2011-04-30 18:02:16

2

我剛剛修改了前一個失蹤發出一個壞的訪問錯誤的其他條件。修改後的代碼如下:

您需要在嵌入單元格和init的代碼塊之前創建文本字段,並將該文本字段添加到位於單元格中的代碼塊中。請記住,表格視圖可以回收單元格,因此當您從屏幕上滾動時,您將得到一個已經有文本字段的重用單元格。然後,您將創建一個新的文本字段並將新的文本字段覆蓋在現有的文本字段上,因此您會重疊。

這裏是你的代碼重構正確

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

static NSString *CellIdentifier = @"Cell"; 
UITextField *txtField; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

//init the textField here, and we will reuse it and reset its data for each row. 
txtField = [[UITextField alloc] initWithFrame:CGRectMake(5, 5, 300, 30)]; 
[cell.contentView addSubview:txtField]; 
txtField.tag=110; //should declare a constant that uniquely defines your textField; 
[txtField release]; 

} 
else{ 

// if the textfield is alread created and now dequed 

    //ok, now we retrieve the textField and set its data according to the row. 
    txtField = (UITextField *)[cell.contentView viewWithTag:110]; 
}  


    if(indexPath.row==0) { 
     txtField.placeholder = @"Full Name"; 
    } 
    else if(indexPath.row==1) { 
     txtField.placeholder = @"Email";  
    } 
    else if(indexPath.row==2){ 
     txtField.placeholder = nil; //? did you mean to set something here? 
     cell.textLabel.text = @"Select Date of Birth"; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 


    return cell; 
    }