Приложение SwiftUI зависает со 100% процессором при отмене прокрутки назад - PullRequest
1 голос
/ 16 апреля 2020

Следующий код может заставить запущенное приложение не отвечать на симуляторы 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()
            }
        }
    }
}

Чтобы вызвать остановку:

  1. Коснитесь текстового поля, чтобы отобразить клавиатуру
  2. Нажмите ссылку на go, чтобы перейти к следующему экрану
  3. Перетащите с левой стороны экрана, но не завершайте жест и вместо этого отпустите досрочно

Там Вот некоторые обходные пути:

  • Удалите элемент панели навигации (кнопка Dummy) в SecondView
  • Уберите использование переменной keyboardHeight в SecondView
  • Не активируйте клавиатуру в ContentView до навигации

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

1 Ответ

0 голосов
/ 17 апреля 2020

Мне удалось отключить клавиатуру перед навигацией, используя следующий обходной путь:

NavigationLink(destination: SecondView(), tag: 2, selection: $navigationSelection) {
    EmptyView()
}
Text("2. Go to second screen")
    .onTapGesture {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
        self.navigationSelection = 2
    }

...