LargeTitles UIScrollView不支持实现_scrollViewWillEndDraggingWithVelocity的多个观察者:targetContentOffset

use*_*052 7 crash tabbar uiscrollview navigationbar swift

我在我的应用程序中使用以下代码实现了大型标题:

if #available(iOS 11.0, *) {
            navigationController?.navigationBar.prefersLargeTitles = true
            navigationItem.largeTitleDisplayMode = .always
        } else {
            // Fallback on earlier versions
        }
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y <= 0 {
        if #available(iOS 11.0, *) {
            self.navigationItem.largeTitleDisplayMode = .always
        } else {
            // Fallback on earlier versions
        }
    } else {
        if #available(iOS 11.0, *) {
            self.navigationItem.largeTitleDisplayMode = .never
        } else {
            // Fallback on earlier versions
        }
    }
    self.navigationController?.navigationBar.setNeedsLayout()
    self.view.setNeedsLayout()
    UIView.animate(withDuration: 0.01, animations: {
        self.navigationController?.navigationBar.layoutIfNeeded()
        self.view.layoutIfNeeded()
    })
}
Run Code Online (Sandbox Code Playgroud)

我能够在tabbar上的视图之间成功切换,但是当我在tabbar控制器上按下一个视图然后使用以下代码将其弹出时:

_ = self.navigationController?.popViewController(animated: true)
Run Code Online (Sandbox Code Playgroud)

当我在tabbar上的视图之间再次切换时,我得到了这个崩溃:由于未捕获的异常'NSInternalInconsistencyException'而终止app,原因:'错误:UIScrollView不支持实现_scrollViewWillEndDraggingWithVelocity的多个观察者:targetContentOffset:'

Raj*_*jat 8

这不是一个解决方案,而是您需要在代码中研究的潜在问题。我收到了同样的错误消息( UIScrollView 不支持多个观察者实现_scrollViewWillEndDraggingWithVelocity:targetContentOffset),并且我注意到我做错了一些事情。我在使用 NavigationView 的 SwiftUI 应用程序中收到此错误消息。

我犯的错误是 ParentView 在根部有一个导航视图。使用 NavigationLink,我转向 ChildView,它也有一个 NavigationView 作为根。代码如下:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            ParentView()
        }
    }
}

struct ParentView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: ChildView()) {
                    Text("Parent view")
                }
            }
            .navigationTitle("Parent")
        }
    }
}

struct ChildView: View {
    var body: some View {
        List {
            ForEach(0 ..< 5) { _ in
                Text("Child view")
            }
        }
        .navigationTitle("Child")
    }
}
Run Code Online (Sandbox Code Playgroud)

最初是这样ChildView的:

struct ChildView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0 ..< 5) { _ in
                    Text("Second screen")
                }
            }
            .navigationTitle("Second")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意我如何尝试推送本身嵌入在 NavigationView 中的视图。如第一个片段所示删除它,处理错误消息。你可以尝试调查一下,也许你只是在 UIKit 而不是 SwiftUI 中犯了同样的错误。


use*_*052 1

当我转到另一个视图时,表视图仍在滚动时,问题就发生了。我通过在scrollViewDidScroll中设置一个布尔值来解决这个问题,该布尔值在segue启动时禁用任何滚动。

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if viewIsVisible {
            if scrollView.contentOffset.y <= 0 {
                if #available(iOS 11.0, *) {
                    self.navigationItem.largeTitleDisplayMode = .always
                } else {
                    // Fallback on earlier versions
                }
            } else {
                if #available(iOS 11.0, *) {
                    self.navigationItem.largeTitleDisplayMode = .never
                } else {
                    // Fallback on earlier versions
                }
            }
            self.navigationController?.navigationBar.setNeedsLayout()
            self.view.setNeedsLayout()
            UIView.animate(withDuration: 0.01, animations: {
                self.navigationController?.navigationBar.layoutIfNeeded()
                self.view.layoutIfNeeded()
            })
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        self.viewIsVisible = false
}
Run Code Online (Sandbox Code Playgroud)