UITextfield在UITableViewCell中带有标记,如果可以看到多个表的一部分,则返回null

时间:2012-10-05 23:03:37

标签: uitableview uitextfield

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

只是尝试一下我改变了我的代码,以便tableview现在只有一个部分。现在一切都显示出来,没有切换到隐藏某些细胞。似乎它不是2个部分的问题,而是有一个单元格在其中包含文本字段之后。怪异。

交换机和文本框的属性很强。

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

-(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"];

我也对文本框使用相同类型的操作。 - (IBAction)dailyLimitEntry:(id)sender

所以,这是我的UITextField的完整IBAction 我基本上从UITextField获取字符串,使其成为一个数字来检查用户是否输入了实数,然后我创建一个整数来查看它是否是十进制数,因为我只想要整数然后我“保存”该条目一些NSUserDefaults。就像最初发布的那样,只要表格的一个部分可见,这就有效。只要我在第二部分中显示开关,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];

}

最后我的cellForRowAtIndexPath: (这是从一切仍然有效的地方。我已经从IB添加了我的新“switchcells”,在这里引用它们像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;

}

问题在于: 所有开关和文本框都通过IBAction链接到接口。 无论第二部分是否可见,我都可以使用所有3个开关设置我的userdefaults。但是如果我的第二部分不可见,则textfield返回它的值,如果它可见则返回null。

有什么想法吗?这真让我疯狂。

1 个答案:

答案 0 :(得分:0)

我解决了我的问题,它现在使用我的UITextField-cell后面的多个部分和单元格。

这就是我的所作所为:

  • 创建一个包含UITextField的原型单元格
  • 通过IBAction“didEndOnExit”将UITextField连接到.h
  • 在cellForRowForIndexPath中设置UITextField-Cell时,请像这样dailyLimitEntry = (UITextField *)[cell viewWithTag:35];引用UITextField(这样,可以通过dailyLimitEntry.text从用户默认设置内容
  • 在UITextField - (IBAction)dailyLimitEntry:(id)sender的didEndEditing的IBAction中,我从发件人给我的任何内容中访问UITextField的内容。为此,我设置了一个像UITextField *cellDailyLimitEntryTextField= (UITextField*)sender;这样的临时变量(长变量名只是为了让我记得我以后回来时所做的事。
  • 现在我可以通过cellDailyLimitEntryTextField.text检索文本字段的值,然后继续我的其余代码。

UITextField现在的行为就像它甚至不在tableview的单元格中,并且直接获取和设置内容。

这对Apple来说是否合适,我会在提交应用后立即知道。但我基本上都是自己制作的应用程序; - )

顺便说一下,不需要UITextFieldDelegate及其方法。我认为设置我的单元格会创建一个UITextField实例,我无法正确访问该实例以接收内容。就像在我的问题中所述,只要没有更多的单元格跟随UITextFieldCell,一切都运行良好。现在我已经将我的UITableView打开到它的初始状态,有2个部分,它可以工作。

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