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.firstName
、self.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 字段的用户输入更改 UIView 框架的高度和宽度
如何从 UITextfields UIMenuController 中删除不需要的 UIMenuItems?