我想在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;
}
答案 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的基础开始。
由于