在 UITableView 重新加载时以编程方式打开/关闭 UITextField 的 inputView
Posted
技术标签:
【中文标题】在 UITableView 重新加载时以编程方式打开/关闭 UITextField 的 inputView【英文标题】:Open/close UITextField's inputView programmatically on UITableView reload 【发布时间】:2018-07-31 09:52:34 【问题描述】:我有一个UITextField
,它是UITableViewCell
的一部分,该表应该是一个哑组件。
UITextField
触发的事件由自定义委托处理,该委托:
-
每次值更改(键入、旋转选择器等)都会触发一系列事件来存储和处理数据
在链的末端
UITableView
完全重新加载。
完全重新加载会导致inputView
消失。
虽然我想要 1. 和 2.,但我不想要 3. inputView
应该保持打开状态并专注于正在编辑的 UITextField
-> 我正在寻找一种方法来打开/关闭 以编程方式,也许将其放在-(void)prepareForReuse
的UITableViewCell
中
我最通用的自定义UITableViewCell
初始化:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
self.inputField = [UITextField new];
[self.inputField addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
[self.contentView addSubview:self.inputField];
[self.inputField setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.inputField.leftAnchor constraintEqualToAnchor:self.contentView.leftAnchor].active = YES;
[self.inputField.rightAnchor constraintEqualToAnchor:self.contentView.rightAnchor].active = YES;
[self.inputField.topAnchor constraintEqualToAnchor:self.contentView.topAnchor].active = YES;
[self.inputField.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor].active = YES;
return self;
更改处理示例(inputView
可以是标准键盘、UIPickerView
或自定义):
-(void) textFieldDidChange:(UITextField *)textField
NSString *valueString = textField.text;
[self.delegate handleValueChange:valueString forAttributeID:self.attributeID];
【问题讨论】:
【参考方案1】:我认为问题在于,一旦您调用reloadData
,将为所有可见部分/行创建新单元格,因此原始输入视图失去其第一响应者状态。
有很多方法可以规避这一点。也许最简单的方法是不调用reloadData
,而只是重新加载“更改”的单元格(´reloadRowsAtIndexPaths:withRowAnimation:`)——尤其是不要使用导致更改的 inputView 重新加载单元格
或者,您可以存储“活动”IndexPath,并在刷新后让相应的 inputView 再次成为第一响应者。
可能还有其他解决方案需要考虑 - 所有这些都取决于您的工作流程。
【讨论】:
解决方案没问题,但我仍然面临每次更改UITextField.text
时键盘不断向上滑动并且表格不断向下滚动的问题。以上是关于在 UITableView 重新加载时以编程方式打开/关闭 UITextField 的 inputView的主要内容,如果未能解决你的问题,请参考以下文章