将UITextField插入TableView

时间:2012-11-16 19:22:25

标签: iphone ios xcode

我想在tableView中使用textFields。所以我将它们手动插入故事板中的tableView并修改了它们各自的属性。但是,当我运行程序时,我看不到文本字段。我用一个开关重复了同样的程序。但它仍然没有运行。所以我认为尽管它们存在于故事板中,但它们并未被显示。

Q1。知道为什么会这样吗?

为了克服这个问题,我以编程方式插入了这些对象。对于UISwitch,我在cellForRowAtindexPath之后的initWithStyle:style reuseIdentifier:reuseIdentifier中添加了以下代码。

UISwitch *newSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(25, 55, 77, 27)];
[newSwitch addTarget: self action: @selector(pictureSwitchAction:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:newSwitch]; 

这很好用。 pictureSwitchAction方法按预期调用。

然而,当我尝试使用UITextField做类似的事情时,应用程序崩溃了。 (仅供参考... field0声明为property。)这是我的代码:

field0 = [[UITextField alloc] initWithFrame:CGRectMake(0, 50, 320, 44)];   // (1)
cell = (UITableViewCell *)[field0 superview];                              // (2)
[self.view addSubview:field0];                                             // (3)

(1)和(2)(评论(3))使应用程序崩溃。错误:*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

我的理解是,在我可以为其分配一些值之前,必须首先返回单元格。但是(1)和(3)(注释(2)),没有结果。我不知道为什么这适用于交换机,而不适用于UITextField。

对Q1的任何回复以及如何以编程方式插入textField?

谢谢!

修改1

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

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone; // VERY IMPORTANT

    if(indexPath.section == 2)
    {
        if (indexPath.row == 0)
        {
            field0 = [[UITextField alloc] initWithFrame:CGRectMake(0, 50, 320, 44)];
            cell = (UITableViewCell *)[field0 superview];
           // [self.view addSubview:field0];
        }

        if (indexPath.row == 1)
        {
            field1 = [[UITextField alloc] initWithFrame:CGRectMake(0, 50, 300, 43)];
            cell = (UITableViewCell *)[field1 superview];            
            // [self.view addSubview:field1];
        }

       if (indexPath.row == 2)
       {
            field2 = [[UITextField alloc] initWithFrame:CGRectMake(0, 50, 300, 43)];
            cell = (UITableViewCell *)[field2 superview];
            // [self.view addSubview:field2];
        }
    }

    return cell;
}

1 个答案:

答案 0 :(得分:1)

在这里你应该像你的

那样改变你的代码

答案-1: - 如果您想通过简单地添加其他视图来自定义单元格,则应将它们添加到内容视图中。因此,当单元格进入和退出编辑模式时,它们将被正确定位。 /强>

答案-2 崩溃原因: - 因为你没有返回UITableViewCell.As Crash Log ItSelf Explain相同的*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

答案3 - 对于这个My understanding is that the cell has to be return first before I can allocate some value to it。这里对于这条线,我会说你完全错了。 can you put mango inside the basket even if you don't have that basket.means you will need that。所以,只要您首先向textfield添加TableCell所需的create(allocate),然后您可以在tableCell上添加任何对象,最后返回tableCell正如您在CellForRowAtIndexPath方法中看到的那样。 我想你现在明白了。

对于UISwitch,您通过self.view表示controller's view添加它。看到您的代码[self.view addSubview:]显示切换到mainView(conrtoller'视图)而不是{{1因为这行tableViewCell它完全没错,所以对于TextField它没有用。

仅供参考,请参阅以下代码。

cell = (UITableViewCell *)[field0 superview];

}

我建议你应该从视图Hierarchy和UITableView的基础开始。

由于