0

我有一个带有 4 个不同原型单元的静态 UITableView。我没有使用包括开关在内的 1 个可重用单元,而是使用了 3 个不同的“switchcell-prototypes”,switchCell1 - to switchCell3(我很懒)。第一个 switchCell 与我制作的 textBoxCell 位于表格的第 1 部分。其他 2 个 switchCells 在第 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 中。就像最初发布的一样,只要表格的一部分可见,它就可以工作。一旦我在第二部分中显示开关,文本字段就会返回 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 个开关设置我的用户默认值。但是如果我的第二部分不可见,则文本字段返回它的值,如果可见则返回 null。

有任何想法吗?这真的让我发疯。

4

1 回答 1

0

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

这是我所做的:

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

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

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

顺便说一句,不需要 UITextFieldDelegate 及其方法。我认为设置我的单元格会创建一个 UITextField 的实例,我没有正确访问它来接收内容。就像我在问题中所说的那样,只要 UITextFieldCell 后面没有更多单元格,一切都会正常工作。现在我已经将我的 UITableView 打开到它的初始状态,有 2 个部分,并且它可以工作。

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

于 2012-10-08T23:49:40.113 回答