将UITextField添加到UITableViewCell仅在LAST单元格中显示textField

时间:2012-01-12 04:26:49

标签: iphone ios uitableview

我有一个包含许多单元格的表格视图。每个单元格都有自己的UITextField。我以编程方式添加了文本字段。我希望在点击编辑按钮时显示每个textField。 (现在表处于编辑模式),再次按下时,我希望所有textField都消失(离开编辑模式)。我知道我可以使用hidden属性完成此操作,但我尝试在此方法中执行此操作:

    - (IBAction)editButton:(id)sender 
{
    if (self.editing) 
    {
        [self setEditing:NO animated:YES];
        [self.myTableView setEditing:NO animated:YES];
        EditButton.title = @"Edit";
        cellText.hidden = YES;  //<-- THIS IS THE CODE
    } 
    else 
    {
        [self setEditing:YES animated:YES];
        [self.myTableView setEditing:YES animated:YES];
        EditButton.title = @"Done";
        cellText.hidden = NO;  //<-- THIS IS THE CODE
    }
}

但它只显示和隐藏非常最后一个单元格的textField。我怎样才能将它显示在它显示的位置,然后不显示每个单元格的textFIeld?非常感谢提前!!!

CELL FOR ROW

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

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


         cellText = [[UITextField alloc]init];
         [cellText setFrame:CGRectMake(190, 15, 55, 30)];
         cellText.text = @"1";
         cellText.borderStyle = UITextBorderStyleRoundedRect;
         cellText.hidden = YES;
         cellText.userInteractionEnabled = NO;
         [cell addSubview:cellText];
    }    

return cell;
}

提前致谢!! :d

4 个答案:

答案 0 :(得分:1)

虽然您为每个单元格创建了一个文本字段,但您只能引用名为cellText的ivar中的最后一个单元格。这就是你显示/隐藏唯一文本字段的原因。

我建议您在切换编辑模式时重新加载表格,并在tableView:cellForRowAtIndexPath:中设置文本字段的可见性。

哦,你应该在将其作为子视图添加后释放cellText。否则你是在泄漏记忆。强烈建议您将子视图添加到UITableViewCell内容视图,而不是直接添加到单元格。

答案 1 :(得分:1)


你可以摆脱这个问题,使用这个技巧,我不确定它是否会在你的代码中创建内存泄漏。因为它每次都会创建新的单元格。但是如果你不知道你肯定可以使用它做一些正确的方法。 ;)

- (IBAction)editButton:(id)sender 
{
 if (self.editing) 
        {
            [self setEditing:NO animated:YES];
            [self.myTableView setEditing:NO animated:YES];
            EditButton.title = @"Edit";

        } 
        else 
        {
            [self setEditing:YES animated:YES];
            [self.myTableView setEditing:YES animated:YES];
            EditButton.title = @"Done";

        }
        [self.myTableView reloadData];
}

重新加载TableView后,检查cellForRowAtIndexPath中的条件,将self.editing的值传递给TextField,使其隐藏/显示。

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

    UITableViewCell *cell  = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


    cellText = [[UITextField alloc]init];
    [cellText setFrame:CGRectMake(190, 15, 55, 30)];
    cellText.text = @"1";
    cellText.borderStyle = UITextBorderStyleRoundedRect;
    cellText.hidden = YES;
    cellText.backgroundColor = [UIColor redColor];
    cellText.userInteractionEnabled = NO;
    [cell addSubview:cellText];

    cellText.hidden=!self.editing;

    return cell;
}

答案 2 :(得分:1)

试试此代码

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
}



- (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];
}
UITextField * cellText = [[UITextField alloc] initWithFrame:CGRectMake(1, 1, 100, 30)];
cellText.tag = 1;
cellText.textColor = [UIColor darkTextColor];
//cellText.numberOfLines = 0;
cellText.font = [ UIFont fontWithName: @"Helvetica-Bold" size: 12.0 ] ; 
cellText.backgroundColor = [ UIColor clearColor ] ;
cellText.text = @"123";
    cellText.hidden = YES;
[cell.contentView addSubview:cellText];
[cellText release];
cellText =nil;

// Set up the cell...


return cell;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
// Detemine if it's in editing mode
  UITextField *cellText = (UITextField *)[[aTableView cellForRowAtIndexPath:indexPath] viewWithTag:1];
if (!self.editing) 
{
    [self setEditing:NO animated:YES];
    [self.tableView setEditing:NO animated:YES];
   // EditButton.title = @"Edit";

    cellText.hidden = YES;  //<-- THIS IS THE CODE
} 
else 
{
    [self setEditing:YES animated:YES];
    [self.tableView setEditing:YES animated:YES];
  //  EditButton.title = @"Done";
    cellText.hidden = NO;  //<-- THIS IS THE CODE
}

return UITableViewCellEditingStyleNone;
}

嗨朋友这个代码对我来说很好,相信你也有一个感恩节

答案 3 :(得分:0)

这实际上是正常的。根据addSubview下的Apple文档:

  

视图只能有一个超级视图。如果视图已经有超视图和   该视图不是接收者,此方法删除了以前的   在使接收器成为新的超级视图之前的超视图。

所以它会继续删除它从单元格中添加和删除直到它到达最后一个。