Я не уверен на 100%, чего ты хочешь достичь. Этот код откроет клавиатуру при нажатии кнопки и покажет textField только тогда, когда пользователь начнет печатать.
Когда кнопка нажата, мы устанавливаем скрытый ответчик textField в true. Таким образом, мы поднимаем клавиатуру, не показывая textField. Когда пользователь начинает печатать, мы открываем текстовое поле и изменяем его ограничения, чтобы они были над клавиатурой.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var textFieldBottomConstraint: NSLayoutConstraint!
var keyboardHeight: CGFloat = 0
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
textField.isHidden = true
textField.delegate = self
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillShow),
name: UIResponder.keyboardWillShowNotification,
object: nil
)
}
@objc func buttonPressed() {
textField.becomeFirstResponder()
}
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardHeight = keyboardFrame.cgRectValue.height
self.keyboardHeight = keyboardHeight
}
}
}
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
textField.isHidden = false
textFieldBottomConstraint.constant = keyboardHeight
return true
}
}
Это - то, что я обычно делаю:
[Test]
public void MyTest()
{
WeakReference reference;
new Action(() =>
{
var service = new Service();
// Do things with service that might cause a memory leak...
reference = new WeakReference(service, true);
})();
// Service should have gone out of scope about now,
// so the garbage collector can clean it up
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.IsNull(reference.Target);
}
NB: Там очень, буквально несколько раз, где необходимо назвать GC.Collect () в производственном приложении. Но тестирование на утечки является одним примером того, где это является соответствующим.
Возможно, Вы могли держать WeakReference к нему и затем проверить, чтобы видеть что он больше живой (т.е.! IsAlive) после того, как тесты завершились.
Это не ответ, однако можно хотеть попытаться выполнить код и в Отладка и в режимы Release (для пользы сравнения).
, По моему опыту, Отладка версия кода JIT'ed сделана легче отладить и таким образом может видеть, что ссылки остаются в живых дольше (я живо функционирую объем), Однако кодируют JITed в [1 111], режим Release может иметь объекты, готовые к набору быстро, после того как это вне объема и если Набор происходит.
Также не ответ на Ваш вопрос: :-)
я интересовался бы наблюдением, что Вы отлаживаете этот код с помощью Visual Studio в режиме Interop (Управляемый и Собственный компонент) и затем повреждаясь после отображения окна сообщения или чего-то. Затем можно открыть Debug-> Windows-Immediate и затем тип
load sos
(Change to thread 0)
!dso
!do <object>
!gcroot <object> (and look for any roots)
(или можно использовать Windbg, поскольку других отправили в предыдущих сообщениях)
Спасибо, Aaron