#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:
После закрытия представления представление все еще находится в памяти. Таким образом, вы получаете все введенные значения как есть. у вас есть два способа достичь желаемого результата:
- После закрытия представления установите для него значение nil. создайте новое представление во время представления.
- Перед представлением вашего представления программно сбросьте свои элементы управления.
вы упомянули, что текстовые просмотры работают отлично, текстовые просмотры создаются вручную?
Комментарии:
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. Я не понял, что вы имеете в виду. Можете ли вы уточнить?