Входы не сбрасываются после нажатия кнопки отмены и повторного открытия представления

У меня есть форма с некоторыми текстовыми полями, переключателями и сборщиками. Все работает нормально, за исключением того, что когда я ввожу что-то в текстовые поля и нажимаю кнопку «Отмена» и снова открываю форму, ввод остается. Просто не могу понять почему.

Теперь приложение, над которым я работаю, огромно. Поэтому не могу поделиться всем, но вот как выглядит мой метод btnCancelClicked:

- (IBAction)btnCancelClicked:(id)sender {
    if(onCompletion) {
        onCompletion(self.myView, YES);

    }
}

Какова логика реализации кнопки отмены? Каков пошаговый процесс, чтобы закрыть представление и не сохранять пользовательский ввод? Я хотел бы понять, в чем может быть проблема. Я ценю любую помощь.

Изменить: [self.myView setNeedsDisplay]; или [self.myView setNeedsLayout]; не помогают.

Edit2: TextViews также работают правильно, а это означает, что когда я что-то набираю, а затем нажимаю кнопку "Отмена" и снова открываю представление, оно находится в исходном состоянии. Единственная проблема связана с TextFields. Должен ли я сделать что-то другое для них?


person Ali    schedule 25.11.2020    source источник
comment
Вероятно, это сделано специально — посмотрите, есть ли в VC или текстовых полях идентификатор восстановления в раскадровке. iOS позволяет вам выполнять восстановление состояния несколькими способами, и я предполагаю, что это использование одного из них. developer.apple.com/documentation/uikit/uiviewcontroller/   -  person skaak    schedule 26.11.2020
comment
@skaak спасибо за предложение, но поле идентификатора восстановления выглядит пустым в инспекторе. Сейчас проверю ссылку.   -  person Ali    schedule 02.12.2020
comment
@skaak Я не думаю, что это как-то связано с тем, что было указано в ссылке, которую вы разместили.   -  person Ali    schedule 02.12.2020
comment
Хорошо, если вы собираетесь сохранить текст. В противном случае, как указано в ответе, представление все еще сохраняется в памяти. setNeedsDisplay/Layout тут ни при чем (думаю). Может быть, показать, как представлено представление, а также показать блок onCompletion. Я думаю, когда вы представляете представление, есть некоторая логика, которая взаимодействует с отменой onCompletion, так что представление каким-то образом сохраняется в памяти - может быть, намеренно вернуться позже после отмены? - и представил снова.   -  person skaak    schedule 02.12.2020


Ответы (1)


После закрытия представления оно остается в памяти. Таким образом, вы получаете все введенное значение как есть. у вас есть два способа достичь желаемого результата:

  1. После закрытия представления установите для него значение nil. создать новое представление во время презентации.
  2. Прежде чем представить свое представление, программно сбросьте элементы управления.

вы упомянули, что TextViews работают отлично, TextViews создаются вручную?

person Manish Punia    schedule 26.11.2020
comment
Спасибо за ответ. Должен ли я установить представление на nil методом btnCancelClicked с self.view = nil? Или я должен сделать это в ViewDidDisappear? Да, они оба создаются вручную и назначаются textFields и textViews в методах DidBeginEditing. - person Ali; 02.12.2020
comment
Я не уверен, что все это self.view используется в завершении, которое вы называете в конце. вы можете установить внутренний обработчик завершения, где вы получаете self.view. - person Manish Punia; 02.12.2020
comment
Я использую self.view = nil в обработчике завершения, а именно блок onCompletion в методе btnCancelClicked, однако никаких изменений не наблюдается. Возможно, потому что я меняю только себя, но изменение происходит где-то еще, и установка self на nil ни на что не влияет? - person Ali; 02.12.2020
comment
Попробуйте создать новый self.view каждый раз, когда вы добавляете в представление. - person Manish Punia; 02.12.2020
comment
Я не понял, что ты имеешь в виду. Можете ли вы уточнить? - person Ali; 02.12.2020
comment
Привет, Али, я хочу сказать, когда вы снова открываете вид. Вы должны добавлять в иерархию представлений или каким-то образом представлять ее. При этом вместо использования уже созданного self.view. Создайте новый экземпляр представления и назначьте его для просмотра и представления или добавьте вновь созданный экземпляр объекта. - person Manish Punia; 04.12.2020