Следующий код может заставить запущенное приложение не отвечать на симуляторы iPhone (не iPad) или iPhone. Xcode показывает, что приложение потребляет 100% ресурсов ЦП, выделяя все больше и больше памяти.
struct SecondView: View {
@State private var keyboardHeight: CGFloat = 0
private let showPublisher = NotificationCenter.Publisher.init(
center: .default,
name: UIResponder.keyboardWillShowNotification
).map { (notification) -> CGFloat in
if let rect = notification.userInfo?["UIKeyboardFrameEndUserInfoKey"] as? CGRect {
return rect.size.height
} else {
return 0
}
}
var body: some View {
VStack(spacing: 20) {
if keyboardHeight == 0 {
Text("This is shown as long as there's no keyboard")
}
Text("This is the SecondView. Drag from the left edge to navigate back, but don't complete the gesture: crash results.")
}.onReceive(self.showPublisher) { (height) in
self.keyboardHeight = height
}
.navigationBarItems(trailing: Button("Dummy") { })
}
}
struct ContentView: View {
@State var textInput = ""
var body: some View {
NavigationView {
VStack(spacing: 20) {
TextField("1. Tap here to show keyboard", text: self.$textInput)
.textFieldStyle(RoundedBorderTextFieldStyle())
NavigationLink(destination: SecondView()) {
Text("2. Go to second screen")
}
Spacer()
}
}
}
}
Чтобы вызвать остановку:
- Коснитесь текстового поля, чтобы отобразить клавиатуру
- Нажмите ссылку на go, чтобы перейти к следующему экрану
- Перетащите с левой стороны экрана, но не завершайте жест и вместо этого отпустите досрочно
Там Вот некоторые обходные пути:
- Удалите элемент панели навигации (кнопка Dummy) в
SecondView
- Уберите использование переменной
keyboardHeight
в SecondView
- Не активируйте клавиатуру в
ContentView
до навигации
Однако я не могу использовать вышеуказанные обходные пути в своем приложении. Кто-нибудь знает, что является причиной root?