我有一个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];
}
最佳答案
我认为问题在于,一旦调用reloadData
,就会为所有可见的部分/行创建新的单元格,因此原始输入视图将失去其第一个响应者状态。
您可以通过多种方式来规避这一点。也许最简单的方法是不调用reloadData
,而是仅重新加载“更改”的单元格(´reloadRowsAtIndexPaths:withRowAnimation:`)-特别是不要使用导致更改的inputView重新加载单元格
或者,您可以存储“活动的” IndexPath,并在刷新后让适当的inputView再次成为第一响应者。
可能还需要考虑其他解决方案-所有这些都取决于您的工作流程。