如果表的多个部分可见,UITableViewCell中带有标记的UITextfield将返回null

如果表的多个部分可见,UITableViewCell中带有标记的UITextfield将返回null,uitableview,uitextfield,Uitableview,Uitextfield,我有一个带有4个不同原型单元的静态UITableView。我使用了3种不同的“switchcell原型”,switchCell1-到switchCell3(我很懒),而不是使用一个包含开关的可重用单元。第一个switchCell位于表的第1部分,以及我制作的textBoxCell。其他2个开关单元在第2节中。 我正在使用标签访问单元格中的开关和文本框 为了试一试,我修改了代码,使tableview现在只有一个部分。现在所有内容都显示出来了,没有切换到隐藏某些单元格。似乎这不是两个部分的问题,而是

我有一个带有4个不同原型单元的静态UITableView。我使用了3种不同的“switchcell原型”,switchCell1-到switchCell3(我很懒),而不是使用一个包含开关的可重用单元。第一个switchCell位于表的第1部分,以及我制作的textBoxCell。其他2个开关单元在第2节中。 我正在使用标签访问单元格中的开关和文本框

为了试一试,我修改了代码,使tableview现在只有一个部分。现在所有内容都显示出来了,没有切换到隐藏某些单元格。似乎这不是两个部分的问题,而是在包含文本字段的部分之后出现了单元格。奇怪

开关和文本框的属性很强

这是我访问交换机和文本框的方式:

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

switchCellLabel = (UILabel *)[cell viewWithTag:10];
dailyLimitSwitch = (UISwitch *)[cell viewWithTag:20];

[dailyLimitSwitch setOn:[settings boolForKey:@"limitBool"]];

textBoxCellLabel = (UILabel *)[cell viewWithTag:30];
dailyLimitEntry = (UITextField *)[cell viewWithTag:40];
这是其中一个开关的操作:

- (IBAction)dailyLimitSwitch:(id)sender {


if ([settings boolForKey:@"limitBool"]==NO) {
    [settings setBool:YES forKey:@"limitBool"];
}else if ([settings boolForKey:@"limitBool"]==YES){
    [settings setBool:NO forKey:@"limitBool"];
    [settings setDouble:(0) forKey:@"limitDouble"];
我对文本框也使用了同样的操作<代码>-(iAction)dailyLimitEntry:(id)发件人

下面是我的UITextField的完整iAction 我基本上是从UITextField中获取字符串,将其转换为一个数字以检查用户输入的是实数,然后创建一个整数以查看它是否是十进制数,因为我只需要整数,然后以一些默认值“保存”该条目。与最初发布的一样,只要表中只有一个部分可见,这种方法就可以工作。一旦我在第二部分中显示开关,textfield就会返回null

- (IBAction)dailyLimitEntry:(id)sender {

NSNumberFormatter *newLimitFormatter = [[NSNumberFormatter alloc]init];

[newLimitFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[newLimitFormatter setMaximumFractionDigits:3];

NSNumber *newLimitNr = [[NSNumber alloc]init];
newLimitNr = [newLimitFormatter numberFromString:dailyLimitEntry.text];

double newLimitDouble = [[newLimitFormatter numberFromString:dailyLimitEntry.text]doubleValue];

int newLimitInt = [newLimitNr intValue];


if (newLimitNr == nil || (newLimitDouble - newLimitInt)>0) {

    UIAlertView *invalidLimitAlert = [[UIAlertView alloc]initWithTitle:@"Limit" message:@"Invalid limit" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

    [invalidLimitAlert show];

}else{

    [settings setDouble:newLimitDouble forKey:@"limitDouble"];

    if (![settings doubleForKey:@"countDouble"]==0) {
        double newRemainingDouble = [settings doubleForKey:@"limitDouble"]-[settings doubleForKey:@"countDouble"];

        [settings setDouble:newRemainingDouble forKey:@"remainingDouble"];

    }else if ([settings doubleForKey:@"countDouble"]==0){
        double newRemainingDouble = [settings doubleForKey:@"limitDouble"];

        [settings setDouble:newRemainingDouble forKey:@"remainingDouble"];
    }
}

[dailyLimitEntry resignFirstResponder];
}

最后是我的CellForRowatineXpath: (这是一切仍然有效的地方。我从IB添加了我的新“switchcell”,通过引用它们,就像这里的switchcell一样,并将数字1和2添加到标识符(switchcell1和switchcell2)中,使它们不同

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


NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];


if (section == 0 && row == 0) {
    cellIdentifier = @"switchCell";
}
if (section == 0 && row == 1) {
    cellIdentifier = @"textBoxCell";
}

NSArray *labelsForCurrentSection = [sectionLabels objectAtIndex:section];

NSString *labelForCurrentCell = [[NSString alloc]init];

labelForCurrentCell = [labelsForCurrentSection objectAtIndex:row];


cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];


switchCellLabel = (UILabel *)[cell viewWithTag:10];
dailyLimitSwitch = (UISwitch *)[cell viewWithTag:20];

[dailyLimitSwitch setOn:[settings boolForKey:@"limitBool"]];


textBoxCellLabel = (UILabel *)[cell viewWithTag:30];
dailyLimitEntry = (UITextField *)[cell viewWithTag:40];

switchCellLabel.text = labelForCurrentCell;
textBoxCellLabel.text = labelForCurrentCell;


if ([settings doubleForKey:@"limitDouble"]==0) {
    dailyLimitEntry.text = @"";
}else{

NSString *dailyLimitStr = [[NSString alloc]initWithFormat:@"%0.f",[settings doubleForKey:@"limitDouble"]];
dailyLimitEntry.text = dailyLimitStr;

}

return cell;
}

问题是: 所有开关和文本框都通过iAction链接到接口。 无论第二节是否可见,我都可以使用所有3个开关设置UserDefault。但是,如果第二节不可见,textfield将返回其值,如果可见,则返回null


有什么想法吗?这真的快把我逼疯了。

我解决了我的问题,现在它在我的UITextField单元格后面处理多个部分和单元格

以下是我所做的:

  • 创建包含UITextField的原型单元
  • 通过iAction“didEndOnExit”将UITextField连接到.h
  • 在cellForRowForIndexPath中设置UITextField单元格时,参考UITextField,如下所示
    dailyLimitEntry=(UITextField*)[Cell viewWithTag:35];
    (这样,可以通过dailyLimitEntry.text从用户默认设置内容
  • 在UITextField的didEndEditing的iAction
    -(iAction)dailyLimitEntry:(id)sender
    中,我从发件人返回的任何内容访问UITextField的内容。为此,我设置了一个临时变量,如
    UITextField*cellDailyLimitEntryTextField=(UITextField*)sender;
    (长变量名只是为了让我能记得我稍后回来时做了什么
  • 现在,我可以通过
    cellDailyLimitEntryTextField.text检索textfield的值,然后继续我的其余代码
UITextField现在的行为就像它甚至不在tableview的单元格中一样,获取和设置内容是直接的

这是否适用于苹果,我会在提交应用程序后立即知道。但我基本上是为自己制作我想要的应用程序;-)

顺便说一句,不需要UITextFieldDelegate及其方法。我认为设置我的单元格会创建一个UITextField实例,我无法正确访问该实例以接收内容。正如我在问题中所述,只要UITextFieldCell后面没有更多的单元格,一切都可以正常工作。现在我打开了UITableView的初始状态te有两个部分,它可以工作


如果您喜欢我对我的问题的回答,请投赞成票。

发布您的
-(iAction)dailyLimitEntry:(id)sender
中的代码,因为这是您遇到的问题。此外,您的整个
表格视图:cellForRowAtIndexPath
可能会有所帮助。