1

フォームの作成に使用される多数のセルを含むテーブル ビューがあります。カスタム TableViewCell を作成しました。このセルにはラベルとテキスト フィールドが含まれているため、たとえば、各行は次のようになります。

ここに画像の説明を入力

ラベルとテキストビューを含むカスタムテーブルセルもあり、上の画像と同じように見えますが、テキストビュー用のスペースを確保するためにセルが大きくなっています。

現在、これらのテキスト フィールドとテキスト ビューのそれぞれにツールバーが追加されているため、テキスト フィールドがファーストレスポンダになると、ツールバーに [完了]、[前]、[次] ボタンが表示されます。

  UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithTextField:)];

        UIBarButtonItem *nextButton = [[UIBarButtonItem alloc]initWithTitle:@"Next" style:UIBarButtonItemStyleDone target:self action:@selector(nextTableTextField:)];

        UIBarButtonItem *previousButton = [[UIBarButtonItem alloc]initWithTitle:@"Previous" style:UIBarButtonItemStyleDone target:self action:@selector(previousTableTextField:)];


        UIToolbar *numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
        numberToolbar.barStyle = UIBarStyleBlackTranslucent;
        numberToolbar.items = [NSArray arrayWithObjects:
                               previousButton,
                               nextButton,
                               [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                               doneButton,
                               nil];

        [numberToolbar sizeToFit];

        field.inputAccessoryView = numberToolbar;

私が抱えている問題は、このような 10 個のテーブル行があるとします。画面には約 5 行と 6 行目のビットしか表示されません。また、テキスト フィールド デリゲートにコードを追加して、テキスト フィールドが最初のレスポンダーになると、画面がスクロールしてテキスト フィールドが完全に表示されるように追加する必要があります。コードについては、こちらの古い投稿を参照してください。

したがって、画面が読み込まれると、最初のセルを押して[次へ]をクリックすると、正常に機能し、次のセルの2番目のテキストフィールドに移動します。次に、もう一度次のボタンを押すと、3 番目のセル、4 番目、5 番目のセルに移動します。この時点で問題が発生します。5 番目のセルで [次へ] をクリックすると、6 番目のテキスト フィールドがファーストレスポンダーになりますが、何らかの理由で画面がスクロールしません。さらに大きな問題は、[次へ] をもう一度クリックしても、7 番目のテキスト フィールドに移動しないことです。これは、7 番目のセルがまだメモリ内になく、画面に表示されていないためです。したがって、次にヒットしても何も起こらず、テキスト フィールド 6 が最初の応答者として残ります。そのため、最初に少し下にスクロールする必要があります。これにより、次のボタンが機能する前にセル 7 が表示され、次のテキスト フィールドがファーストレスポンダになります。

前のボタンを押したときと同じ問題です。前のボタンを押したときに前のセルが画面に表示されていない場合、そのセルが画面に表示されるまで何もしません。

これを回避する方法が見つからないように見えるので、これは私にかなりの頭痛の種を引き起こしています。他の誰かがこのような同様の問題を抱えていますか? この問題を回避する良い方法はありますか?

前もって感謝します

編集:

また、クリックすると各テーブルセルをループして各フィールドにデータを保存するボタンがあると言うと、画面に表示されているテーブルセルのみをループし、残りを無視するため、データの保存が問題になることも追加する必要があります。

4

2 に答える 2

1

それは私にとってはうまくいきます.キーボードの「完了」ボタンを押して次のテキストフィールドセルにフォーカスを移動すると起動されるブロックを使用しています:

FRTextFieldTableViewCell *textFieldCell = [tableView_ dequeueReusableCellWithIdentifier:[FRTextFieldTableViewCell reuseIdentifier]];
        if(textFieldCell == nil) {
            textFieldCell = [[FRTextFieldTableViewCell alloc] initWithStyle:
                             UITableViewCellStyleDefault reuseIdentifier:[FRTextFieldTableViewCell reuseIdentifier]];
        }

        [textFieldCell.textField initialize];
        textFieldCell.textField.secureTextEntry = (indexPath.row == 3);

        __weak FRSignUpViewController *self_ = self;
        __weak FRTextFieldTableViewCell *textFieldCell_ = textFieldCell;
        if(indexPath.row == 1) {
            textFieldCell.textField.placeholder = NSLocalizedString(@"name", @"");
            textFieldCell.object = self.regUser.name;
            textFieldCell.didChangedValueAction = ^(NSString *object) {
                [self_ setName:object];
            };
            textFieldCell.didEndOnExitAction = ^{
                [self_ setName:textFieldCell_.object];
                FRTextFieldTableViewCell *nextCell = (FRTextFieldTableViewCell *)[self_.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]];
                [nextCell.textField becomeFirstResponder];
            };
        }
        if(indexPath.row == 2) {
            textFieldCell.textField.placeholder = NSLocalizedString(@"email", @"");
            textFieldCell.didChangedValueAction = ^(NSString *object) {
                [self_ setLoginString:object];
            };
            textFieldCell.didEndOnExitAction = ^{
                [self_ setLoginString:textFieldCell_.object];
                FRTextFieldTableViewCell *nextCell = (FRTextFieldTableViewCell *)[self_.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:0]];
                [nextCell.textField becomeFirstResponder];
            };
        }
        if(indexPath.row == 3) {
            textFieldCell.textField.placeholder = NSLocalizedString(@"password", @"");
            textFieldCell.didChangedValueAction = ^(NSString *object) {
                [self_ setPasswordString:object];
            };
            textFieldCell.didEndOnExitAction = ^{
                [self_ setPasswordString:textFieldCell_.object];
                [self_ signUp];
            };
        }
        [textFieldCell reloadData];
        return textFieldCell;

BlocksTypedef:

/* type defenition for blocks, can be used by any app class */
typedef void (^CompletionBlock)(id, NSError *);
typedef void (^SimpleBlock)(void);
typedef void (^InfoBlock)(id);
typedef void (^ConfirmationBlock)(BOOL);

TableViewCell コード:

.h ファイル:

#import "FRTableViewCell.h"
#import "BlocksTypedefs.h"
#import "FRTextFieldWithPadding.h"

@interface FRTextFieldTableViewCell : FRTableViewCell <UITextFieldDelegate>

@property (nonatomic, copy) SimpleBlock didEndOnExitAction;
@property (nonatomic, copy) SimpleBlock didEndEditingAction;
@property (nonatomic, copy) InfoBlock didChangedValueAction;
@property (nonatomic, strong) IBOutlet FRTextFieldWithPadding *textField;

@end

.m:

    #import "FRTextFieldTableViewCell.h"

@implementation FRTextFieldTableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
    self.backgroundColor = [UIColor clearColor];
}

- (void)reloadData {
    self.textField.text = self.object;
}

- (IBAction)textFieldValueDidChanged:(UITextField *)sender {
    self.object = sender.text;
    if (self.didChangedValueAction) {
        self.didChangedValueAction(self.object);
    }
}

- (IBAction)textFieldDidEndOnExit:(UITextField *)sender {
    self.object = sender.text;
    if (self.didEndOnExitAction) {
        self.didEndOnExitAction();
    }
}

#pragma mark - UITextFieldDelegate

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.object = textField.text;
    if (self.didEndEditingAction) {
        self.didEndEditingAction();
    }
}

@end
于 2013-02-25T10:32:48.303 に答える
0
CGRect frame = CGRectMake(0.0, self.view.bounds.size.height, self.view.bounds.size.width, 44.0);
fieldAccessoryView = [[UIToolbar alloc] initWithFrame:frame];
fieldAccessoryView.barStyle = UIBarStyleBlackOpaque;
fieldAccessoryView.tag = 200;

[fieldAccessoryView setBarStyle:UIBarStyleBlack];

UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone  target:self action:@selector(done:)];

UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Previous", @""), NSLocalizedString(@"Next", @""), nil]];
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
[segmentedControl setMomentary:YES];
UIBarButtonItem *segmentButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];

[fieldAccessoryView setItems:[NSArray arrayWithObjects:segmentButton, spaceButton, doneButton, nil] animated:NO];
[segmentButton release];
[spaceButton release];
[doneButton release];
[segmentedControl release];
于 2013-02-25T10:02:34.093 に答える