0

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 を返します。

何か案は?それは本当に私を夢中にさせています。

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は、テーブルビューのセル内に配置されていないように動作するようになり、コンテンツの取得と設定は簡単です。

これがAppleにとって問題ないかどうかは、アプリを送信するとすぐにわかります。でも基本的には自分で欲しいアプリを作っています;-)

ちなみに、UITextFieldDelegateとそのメソッドは必要ありませんでした。セルを設定すると、コンテンツを受信するために適切にアクセスできなかったUITextFieldのインスタンスが作成されると思います。私の質問で述べたように、UITextFieldCellの後にセルが続かない限り、すべてが正常に機能しました。これで、UITableViewを2つのセクションで初期状態に開いたところ、機能します。

私の質問に対する私の答えが気に入ったら、投票してください。

于 2012-10-08T23:49:40.113 に答える