在UITableView重新加载时以编程方式打开/关闭UITextField的inputView

时间:2018-07-31 09:52:34

标签: ios uitableview delegates uitextfield uicontrol

我有一个UITextField的一部分UITableViewCell,该表应该是哑表。

UITextField触发的事件由自定义委托处理,该委托:

  1. 每次更改值(键入,旋转选择器等)都会触发一系列事件来存储和处理数据
  2. UITableView的末尾已完全加载。
  3. 完全重新加载会导致inputView消失。

虽然我想要1.和2.,但是我不想3. inputView应该保持打开状态,并专注于正在编辑的UITextField->我正在寻找一种方法来实现以编程方式>打开/关闭,也许将其放置在-(void)prepareForReuse的{​​{1}}

我最通用的自定义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

1 个答案:

答案 0 :(得分:1)

我认为问题在于,一旦调用reloadData,就会为所有可见的部分/行创建新的单元格,因此原始输入视图将失去其第一个响应者状态。

有很多方法可以规避这一点。也许最简单的方法是不调用reloadData,而只是重新加载“已更改”的单元格(´reloadRowsAtIndexPaths:withRowAnimation:`)-特别是不要使用导致更改的inputView重新加载单元格< / p>

或者,您可以存储“活动的” IndexPath,并在刷新后让适当的inputView再次成为第一响应者。

可能还需要考虑其他解决方案-所有这些都取决于您的工作流程。