0

この質問に近いすべての投稿を見てきましたが、まだ有用なものが見つかりません。ユーザーが入力するフォームとして使用されているすべてのセルに textFields があります。スクロールするときを除いて、セルのすべてが正常に機能します。セルが画面からスクロールすると、textFields の入力が消えます。これはデキューが原因であることを知っています。ただし、入力したデータを保存して、スクロールしたりアプリを終了したりするときにデータが消えないようにする方法が必要です。また、この情報を PDF またはドキュメントとして電子メールで送信できるようにしたいと考えています。これを達成するための最良の方法は何ですか?以下のコードは、セルなどを生成する方法の例です。

.h ファイル

@interface MasterViewController : UITableViewController <UITextFieldDelegate, UITextFieldDelegate, UITableViewDataSource, UINavigationBarDelegate>{

    NSString* name_;
    UITextField* nameFieldTextField;

}

// Creates a textfield with the specified text and placeholder text
-(UITextField*) makeTextField: (NSString*)text
              placeholder: (NSString*)placeholder;

// Handles UIControlEventEditingDidEndOnExit
- (IBAction)textFieldFinished:(id)sender;

@property (nonatomic,copy) NSString* name;

.m ファイル

@synthesize name = name_;

- (void)viewDidLoad{

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

self.name = @"";
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    // Make cell unselectable and set font.
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13];

    if (indexPath.section == 0) {

    UITextField* tf = nil;
    switch ( indexPath.row ) {
        case 0: {
            cell.textLabel.text = @"Name" ;
            tf = nameFieldTextField = [self makeTextField:self.name placeholder:@"John Appleseed"];
            nameFieldTextField.tag = 1;
            [cell addSubview:nameFieldTextField];
            break ;
    }
    // Textfield dimensions
    tf.frame = CGRectMake(120, 12, 170, 30);

    // Workaround to dismiss keyboard when Done/Return is tapped
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
 }
 return cell;
}


// Textfield value changed, store the new value.
- (void)textFieldDidEndEditing:(UITextField *)textField {

        //Section 1.
    if ( textField == nameFieldTextField ) {
    self.name = textField.text ;
}
}

- (void)viewWillAppear:(BOOL)animated{

    NSString *nameCellString = [[NSUserDefaults standardUserDefaults] stringForKey:@"nameCellString"];
nameFieldTextField.text = nameCellString;

}

- (void)viewWillDisappear:(BOOL)animated{

    NSString *nameCellString = self.name;

    [[NSUserDefaults standardUserDefaults] setObject:nameCellString forKey:@"nameCellString"];

}
4

4 に答える 4

1

ここには実際には 2 つの問題があり、どちらもcellForRowAtIndexPath:実装に含まれています。

  • このセルが再利用され、既にテキスト フィールドがある場合でも、テキスト フィールドをセルに挿入しています。したがって、実際にはテキスト フィールドの上にテキスト フィールドを重ねて、以前に存在していたテキスト フィールドを覆い隠しています。

  • その行 (インデックス パス) のテキスト フィールドに既にテキストがある場合、テキストをテキスト フィールドに戻すことはありません。

つまり、セルは(おっしゃる通り)再利用されているので、その点を考慮するのはあなた次第です。着信セルの状態を確認し、それに応じてセルを再構成する必要があります。

于 2013-05-21T00:34:24.827 に答える
1

まず、ストーリーボードにカスタム セルを作成し、それを取得することを検討してください。コーディングするよりもはるかに簡単で、未来だと思います。つまり、文字列をメソッドにハードコーディングするのではなく、tableView に NSArray を設定することを検討してくださいcellForRowAtIndexPath。私はあなたにこれの例を与える自由を取りました。

以下はコードに基づいており、コピー/貼り付けのソリューションである必要があります。それを見て、それがどのように機能するかを見てください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *titlesArray = @[@"Name", @"Birthday", @"Favorite Food"];

    UITableViewCell *cell;
    cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%i%i", indexPath.section, indexPath.row]];

    if (cell == nil) {
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

    // Make cell unselectable and set font.
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13];

    // Populate label from array
    cell.textLabel.text = titlesArray[indexPath.row];
    if (indexPath.section == 0) {

    UITextField* tf = nil;
    switch ( indexPath.row ) {
        case 0: {

            tf = nameFieldTextField = [self makeTextField:self.name placeholder:@"John Appleseed"];
            nameFieldTextField.tag = 1;
            [cell addSubview:nameFieldTextField];
            break ;
    }
    // Textfield dimensions
    tf.frame = CGRectMake(120, 12, 170, 30);

    // Workaround to dismiss keyboard when Done/Return is tapped
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
 }
    // Set the reuse identifier to a unique string, based on placement in table
    // This ensures that the textField will retain its text
    cell.reuseIdentifier = [NSString stringWithFormat:@"%i%i", indexPath.section, indexPath.row];

}
 return cell;
}


// Textfield value changed, store the new value.
- (void)textFieldDidEndEditing:(UITextField *)textField {

        //Section 1.

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    switch (textField.tag) {
        case 1:
            [defaults setObject:textField.text forKey:@"nameCellString"];
            self.name = textField.text;
            break;
        default:
            break;
    }

    [defaults synchronize];
}

編集:より多くのセルに対応するように変更されました。

于 2013-06-05T17:03:11.207 に答える
0

tableDataSourceArray には UIDictionary の配列を使用する必要があります。

step1) 

NSArray *tableDataSourceArray = [[NSArray alloc]init];
NSMutableDictionary *cellData = [[NSMutableDictionary alloc]init];
[cellData setValue:@"" forKey:@"Name"];
...//so on
[tableDataSourceArray addObject:cellData];
cellData = nil;

repeat step1 as number of records you have.

現在cellForRowAtIndexPath:

 nameFieldTextField.tag = indexPath.row; //To store index of dataSourceArray
    nameFieldTextField.text = [[tableDataSourceArray objectAtIndex:indexPath.row] valueForKey:@"Name"];

そして最後にtextFieldDidEndEditing

NSMutableDictionary *cellDataDic = tableDataSourceArray objectAtIndex:textField.tag];

[cellDataDic setValue:textField.text forKey:@"名前"];

それがあなたを助けることを願っています。

于 2013-06-11T11:05:26.920 に答える
0

問題を解決する最も簡単な方法は、セルの新しいクラスを作成し(から継承UITableViewCell)、のような新しいプロパティを追加することだと思いcustomerTextField (UITextField)ます。コンストラクターで新しいテキストフィールドを追加しますが、CGRectZero. メソッド layoutSubviews では、テキストフィールドに割り当てCGRectます。一般的に言えば、このアプローチはUIViewControllerよりクリーンになります (テキストフィールドの状態をチェックする回数を減らします)。

于 2013-06-11T09:00:31.797 に答える