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 行的一部分。我应该添加我还向文本字段委托添加了代码,以便当文本字段成为第一响应者时,屏幕滚动以允许文本字段完全显示。有关代码,请参阅我的旧帖子。

因此,当屏幕加载时,我按下第一个单元格,然后单击下一步,工作正常,移动到下一个单元格中的第二个文本字段。然后我再次按下下一个按钮,它转到第 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;

块类型定义:

/* 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

米:

    #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 回答