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

#objective-c #forms #uitextfield #cancel-button

#objective-c #формы #uitextfield #кнопка отмены

Вопрос:

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

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

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

    }
}
 

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

Редактировать: [self.myView setNeedsDisplay]; или [self.myView setNeedsLayout]; не помогают.

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

Комментарии:

1. Вероятно, это сделано специально — посмотрите, есть ли у VC или текстовых полей идентификатор восстановления в раскадровке. iOS позволяет выполнять восстановление состояния несколькими способами, и я предполагаю, что это использует один из них. developer.apple.com/documentation/uikit/uiviewcontroller /…

2. @skaak спасибо за предложение, но поле идентификатора восстановления выглядит пустым в инспекторе. Сейчас я проверю ссылку.

3. @skaak Я не думаю, что это имеет какое-то отношение к тому, что было указано в ссылке, которую вы опубликовали.

4. Хорошо, если вы намерены сохранить текст. В противном случае, как указано в ответе, представление все еще сохраняется в памяти. setNeedsDisplay / Layout не имеет к этому никакого отношения (я разведываю). Может быть, показать, как представлено представление, а также показать onCompletion блок. Я думаю, что когда вы представляете представление, есть некоторая логика, которая взаимодействует с отменой onCompletion , так что представление каким-то образом сохраняется в памяти — может быть, специально, чтобы вернуться позже после отмены? — и снова отображается.

Ответ №1:

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

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

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

Комментарии:

1. Спасибо за ответ. Должен ли я установить для представления значение nil с помощью метода btnCancelClicked с self.view = nil помощью? Или я должен сделать это в viewDidDisappear? Да, они оба создаются вручную и назначаются текстовым полям и текстовым представлениям в методах DidBeginEditing.

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

3. Я использую self.view = nil в обработчике завершения, а именно в блоке onCompletion в методе btnCancelClicked, однако никаких изменений не наблюдается. Возможно, потому, что я меняю только self, но изменение происходит где-то в другом месте, и установка self на nil ничего не влияет?

4. Попробуйте создать новый self.view каждый раз, когда вы добавляете в view.

5. Я не понял, что вы имеете в виду. Можете ли вы уточнить?