UITextField в UITableView с InputView DatePicker - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь сделать следующее:

Внутри каждой ячейки у меня есть дата-с и дата-до UITextField.Когда пользователь нажимает либо TextField, появляется InputView DatePicker с кнопкой Готово для завершения.

Моя задача состоит в том, чтобы я только хотел, чтобы пользователь мог выбирать любое из текстовых полей внутри выбранной ячейки и ни одно другое.После завершения пользователь должен нажать «Готово» на InputView, чтобы приложение могло при необходимости проверить и перезагрузить TableView.

У меня есть код, который хорошо управляет обычным выбором ячеек, когда отображается «клавиатура», но не может управлятьUITextField поведение, как я хотел бы.

Я поделился некоторым кодом в надежде, что кто-то может мне помочь:

- (void)keyboardWillShow:(NSNotification*)aNotification {
    self.TableViewDiary.allowsSelection = NO;
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
    self.TableViewDiary.allowsSelection = YES;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ActivityDiaryCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ActivityDiaryCellId"];

    cell.activity = [self.activitycollection objectAtIndex:indexPath.row];
    cell.LabelName.text = cell.activity.name;
    cell.TextFieldStartDt.text = [self FormatPrettyTime :cell.activity.startdt];
    cell.TextFieldEndDt.text = [self FormatPrettyTime :cell.activity.enddt];

    cell.datePickerStart.date = cell.activity.startdt;
    cell.datePickerEnd.date = cell.activity.enddt;
    cell.tag = indexPath.row;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}

ActivityDiaryCell

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code

    self.datePickerStart = [[UIDatePicker alloc] init];
    self.datePickerStart.datePickerMode = UIDatePickerModeDateAndTime;
    //self.datePickerStart.date = self.activity.startdt;
    [self.datePickerStart addTarget:self action:@selector(datePickerStartValueChanged:) forControlEvents:UIControlEventValueChanged]; // method to respond to changes in the picker value

    self.datePickerEnd = [[UIDatePicker alloc] init];
    self.datePickerEnd.datePickerMode = UIDatePickerModeDateAndTime;
    //self.datePickerEnd.date = self.activity.enddt;
    [self.datePickerEnd addTarget:self action:@selector(datePickerEndValueChanged:) forControlEvents:UIControlEventValueChanged]; // method to respond to changes in the picker value

    self.datePickerToolbar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 44)];
    [self.datePickerToolbar setTintColor:[UIColor grayColor]];
    UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(dismissPicker:)];
    UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    [self.datePickerToolbar setItems:[NSArray arrayWithObjects:space,doneBtn, nil]];

    self.TextFieldStartDt.delegate = self;
    self.TextFieldStartDt.inputView = self.datePickerStart;
    self.TextFieldStartDt.inputAccessoryView = self.datePickerToolbar;

    self.TextFieldEndDt.delegate = self;
    self.TextFieldEndDt.inputView = self.datePickerEnd;
    self.TextFieldEndDt.inputAccessoryView = self.datePickerToolbar;
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Я переместил UITextFieldDelegate вверх в TableViewController и включил туда следующий код:

-(bool) textFieldShouldBeginEditing:(UITextField *)textField {
if (self.TableViewDiary.allowsSelection) {
    return true;
} else {
    CGPoint buttonPosition = [textField convertPoint:CGPointZero toView:self.TableViewDiary];
    NSIndexPath *indexPath = [self.TableViewDiary indexPathForRowAtPoint:buttonPosition];
    ActivityDiaryCell *cell = [self.TableViewDiary cellForRowAtIndexPath:indexPath];
    if ([cell.TextFieldStartDt isFirstResponder] || [cell.TextFieldEndDt isFirstResponder]) {
        return true;
    }
}
return false;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
CGPoint buttonPosition = [textField convertPoint:CGPointZero toView:self.TableViewDiary];
NSIndexPath *indexPath = [self.TableViewDiary indexPathForRowAtPoint:buttonPosition];
ActivityDiaryCell *cell = [self.TableViewDiary cellForRowAtIndexPath:indexPath];
[cell setSelected:YES animated:NO];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
CGPoint buttonPosition = [textField convertPoint:CGPointZero toView:self.TableViewDiary];
NSIndexPath *indexPath = [self.TableViewDiary indexPathForRowAtPoint:buttonPosition];
ActivityDiaryCell *cell = [self.TableViewDiary cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:YES];
}
0 голосов
/ 25 февраля 2019

Клавиатура отображается, потому что пользователь коснулся текстового поля, а не потому, что он выбрал ячейку.Вот почему allowsSelection не влияет на него.

Переместите ручку UITextFieldDelegate на UITableViewController.Затем вы можете легко решить, отображать ли средство выбора даты:

  • , если средство выбора даты скрыто, покажите его и запомните ячейку, текстовое поле которой находится на
  • , если средство выбора даты ужевидимый, проверьте, принадлежит ли текстовое поле к той же ячейке и либо обновите средство выбора даты, либо ничего не делайте (переопределяя textFieldShouldBeginEditing(_:) и возвращая false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...