我有一个UITextFieldUITableViewCell的一部分,表应该是一个哑组件。

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];
}

最佳答案

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

您可以通过多种方式来规避这一点。也许最简单的方法是不调用reloadData,而是仅重新加载“更改”的单元格(´reloadRowsAtIndexPaths:withRowAnimation:`)-特别是不要使用导致更改的inputView重新加载单元格

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

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

07-28 03:40
查看更多