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:'
这不是一个解决方案,而是您需要在代码中研究的潜在问题。我收到了同样的错误消息( 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 中犯了同样的错误。
当我转到另一个视图时,表视图仍在滚动时,问题就发生了。我通过在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)
| 归档时间: |
|
| 查看次数: |
1837 次 |
| 最近记录: |