4 つの異なるプロトタイプ セルを持つ静的な UITableView があります。スイッチを含む 1 つの再利用可能なセルで作業する代わりに、3 つの異なる「switchcell-prototypes」、switchCell1 - switchCell3 を使用しました (私は怠け者でした)。最初の switchCell は、私が作成した textBoxCell とともに、テーブルのセクション 1 にあります。他の 2 つの switchCells はセクション 2 にあります。タグを使用してセル内のスイッチとテキスト ボックスにアクセスしています。
試してみるために、テーブルビューにセクションが 1 つしかないようにコードを変更しました。特定のセルを非表示にする切り替えなしで、すべてが表示されるようになりました。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];
これは、スイッチの 1 つのアクションです。
- (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から文字列を取得し、それを数値にして、ユーザーが実数を入力したことを確認し、整数を作成して、それが10進数かどうかを確認します。整数を入力してから、エントリをいくつかの NSUserDefaults に「保存」します。最初に投稿したように、これはテーブルの 1 つのセクションのみが表示されている限り機能します。2 番目のセクションでスイッチを表示するとすぐに、テキスト フィールドは 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: (これはまだすべてが機能していた場所です。ここで switchcell のように参照することで IB から新しい「switchcells」を追加し、番号 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 を介してインターフェイスにリンクされています。2 番目のセクションが表示されているかどうかに関係なく、3 つのスイッチすべてで userdefaults を設定できます。しかし、テキストフィールドは、2 番目のセクションが表示されていない場合は値を返し、表示されている場合は null を返します。
何か案は?それは本当に私を夢中にさせています。