簡體   English   中英

在UITableView重新加載時以編程方式打開/關閉UITextField的inputView

[英]Open/close UITextField's inputView programmatically on UITableView reload

我有一個UITextField ,它是UITableViewCell一部分,表應該是一個啞組件。

UITextField觸發的事件由自定義委托處理,該委托:

  1. 每次值更改(鍵入,旋轉選擇器等)都會觸發一系列事件,以存儲和處理數據
  2. 在鏈的末尾, UITableView已完全重新加載。
  3. 完全重新加載會導致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再次成為第一響應者。

可能還需要考慮其他解決方案-所有這些都取決於您的工作流程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM