UITableViewCell 中的 UITextField 和模态视图中的验证

Posted

技术标签:

【中文标题】UITableViewCell 中的 UITextField 和模态视图中的验证【英文标题】:UITextField in UITableViewCell and validation in modal view 【发布时间】:2012-07-24 14:03:45 【问题描述】:

我正在使用this *** posting 中描述的方法从文本字段中检索值。我的问题是表格视图是模态显示的,我有一个 save 按钮来验证输入并存储它。

问题是textFieldDidEndEditing 方法在用户单击UIBarButtonItem(= 关闭模式视图的保存按钮)时被调用。

在这种情况下(当用户想要保存输入时)我想验证它。但是这些值存储在textFieldDidEndEditing 的属性中。由于未调用此方法,因此无法正确验证输入值。

有人对此有提示或解决方案吗?

提前致谢!

【问题讨论】:

【参考方案1】:

您应该为您的文本字段分配唯一的标签编号,然后跟踪 textFieldDidBeginEditing 委托中的当前活动(即使用 int iVar 存储活动的文本字段标签值)以及用户单击保存时,您应该通过它的标签值获取最后一个文本字段,然后是它的文本值,以便您可以验证它。

【讨论】:

我不能使用tag 属性。我目前正在使用它从单元格([cell viewForTag:...])中检索文本字段。还有其他建议吗? 感谢您的意见。存储索引的好主意,但我已经改进了一点。 我看不出有什么理由不能通过标签访问 textview,即使它在单元格中也是如此。只需使用唯一的标签号,一旦你获得对单元格的引用,就执行 UITextView myTextView = (UITextView)[cell.contentView viewWithTag:XXX]; 是的,这行得通(基本上和我在下面的帖子中所做的和描述的一样)。我想,你在上面的帖子中是如何描述的,我必须为所有单元格分配一个唯一的标签号。该标记在内部单元格中是唯一的,但不是在所有行旁边。【参考方案2】:

好的,我们开始:

感谢@Lefteris 和他存储当前索引的想法。由于我无法将索引存储到tag 属性中,我决定存储活动的indexPath 以及活动的textField。 (我知道,引用 UITextField 就足够了,但我需要它来处理其他内容)

首先我添加了这两个属性:

@property (nonatomic, strong) NSIndexPath *activeIndexPath;
@property (nonatomic, strong) UITextField *activeTextField;

然后我实现了textFieldDidBeginEditing:textFieldDidEndEditing:UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField

    NSIndexPath *indexPath = (NSIndexPath*)[self.tableView indexPathForCell:(UITableViewCell*)[[textField superview] superview]];

    self.activeTextField = textField;
    self.activeIndexPath = indexPath;


- (void)textFieldDidEndEditing:(UITextField *)textField 

    NSString *input = textField.text;    

    //assuming values from input textfield into corresponding properties
    [self assumeInput:input withIndexPath:self.activeIndexPath];

    self.activeTextField = nil;
    self.activeTextField = nil;

textFieldDidEndEditing: 中,我使用[self assumeInput:input withIndexPath:self.activeIndexPath]; 方法将值存储到我的属性中(例如self.firstNameself.lastName 等等...)。

在我的saveAction-方法中,我存储了来自当前活动的TextField 的值。

- (IBAction)saveButtonClicked:(UIBarButtonItem *)sender 
    
    //assuming input from active field (didEndEditing _not_ called right now!)
    [self assumeInput:self.activeTextField.text withIndexPath:self.activeIndexPath];

    //test output
    NSLog(@"firstName: %@", self.firstName);
    NSLog(@"lastName: %@", self.lastName);
    NSLog(@"email: %@", self.email);
    ...

...就是这样!

希望对您有所帮助!感谢@Lefteris 的意见。

最好, 克里斯

【讨论】:

以上是关于UITableViewCell 中的 UITextField 和模态视图中的验证的主要内容,如果未能解决你的问题,请参考以下文章

根据内容大小属性设置 UIText 视图的宽度

从 UIText 字段的用户输入更改 UIView 框架的高度和宽度

无法更改 UIText 视图的字体(使用 Web 服务时)

如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?

UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签

更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象