在 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)prepareForReuseUITableViewCell

我最通用的自定义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的主要内容,如果未能解决你的问题,请参考以下文章

选中模态视图行

从控制器重新加载 UITableView

在播放到苹果电视时以编程方式在 iOS 中关闭镜像?

将uitableview重新加载到底部单元格

UITableView如何在重新加载后继续滚动

在 UITableViewController 中以编程方式切换 UITableView