0

我想在 tableView 中有 textFields。因此,我将它们手动插入到情节提要的 tableView 中并修改了它们的各个属性。但是,当我运行程序时,我看不到文本字段。我用一个开关重复了同样的过程。但它仍然没有运行。因此,我认为尽管对象存在于情节提要中,但并未显示这些对象。

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

为了克服这个问题,我以编程方式插入了这些对象。对于 UISwitch,我cellForRowAtindexPathinitWithStyle: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;
}
4

1 回答 1

1

在这里,您应该在代码中进行更改,例如 As

答案 1:- 如果您想通过简单地添加其他视图来自定义单元格,您应该将它们添加到内容视图中。这样它们将在单元格进入和退出编辑模式时得到适当的定位。

答案 2崩溃原因:- 因为您没有返回 UITableViewCell.As Crash Log ItSelf 解释相同*** 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,就会出现相同的概念。我想你现在清楚了。TableCellcreate(allocate)tableCelltableCellCellForRowAtIndexPath

对于 UISwitch 您正在通过self.view手段添加它。controller's view查看您的代码[self.view addSubview:]显示切换 mainView(conrtoller 视图)而不是 Shwoing 。tableViewCell对于 TextField 它由于这条线而无法正常工作,这cell = (UITableViewCell *)[field0 superview];是完全错误的。

只是为了您的信息,请参见下面的代码。

- (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)
    {
        UITextField* thisTextField =[[UITextField alloc] initWithFrame:CGRectMake(originX, originY, width ,hieght)];//pass the co-ordinate.
        [thisTextField setBackgroundColor:[UIColor clearColor]];
        [thisTextField setTag:indexPath.row];//here by setting this you can access further it         
        thisTextField.delegate= self;
        [[cell contentView] addSubview:thisTextField];
        // If you want to customize cells by simply adding additional views, 
        // you should add them to the content view .
        //  so they will be positioned appropriately as the cell transitions into and out of editing mode.
    }

return cell;

}

我建议你应该从视图层次结构和 UITableView 的基础开始。

谢谢

于 2012-11-16T20:05:29.037 回答