Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NavigationLink存在SwiftUI搜索栏问题_Swiftui_Searchbar_Swiftui Navigationlink - Fatal编程技术网

NavigationLink存在SwiftUI搜索栏问题

NavigationLink存在SwiftUI搜索栏问题,swiftui,searchbar,swiftui-navigationlink,Swiftui,Searchbar,Swiftui Navigationlink,我在SwiftUI中出现搜索栏问题。 当我使用NavigationLink时,其显示有延迟。我发现问题只出现在NavigationLinks上,如果我使用条件覆盖或其他“手工”方式在视图之间移动,问题就不会出现。你知道我能做些什么来解决这个问题吗 这是我的视图代码: import SwiftUI struct ContentView: View { @State var searchText = "" var body: some Vie

我在SwiftUI中出现搜索栏问题。 当我使用NavigationLink时,其显示有延迟。我发现问题只出现在NavigationLinks上,如果我使用条件覆盖或其他“手工”方式在视图之间移动,问题就不会出现。你知道我能做些什么来解决这个问题吗

这是我的视图代码:

import SwiftUI

struct ContentView: View {
    
    @State var searchText = ""
    
    var body: some View {
        
        NavigationView{
            
            NavigationLink(destination: ContentView2()){
                Text("Go to Sub View")
            }
            .navigationBarTitle("Main View")
            .add(SearchBar(text: self.$searchText, hide: true, placeholder: "Search", cancelButton: true, autocapitalization: .sentences))
        }
    }
}

struct ContentView2 : View {
    
    @State var searchText = ""
    
    var body: some View {
        
        Text("Hello, world!")
            
            .navigationBarTitle("Sub View")
            .add(SearchBar(text: self.$searchText, hide: true, placeholder: "Search", cancelButton: true, autocapitalization: .sentences))
        
    }
}
我的搜索条形码

import SwiftUI

class SearchBar: NSObject, ObservableObject {
    
    
    let searchController: UISearchController = UISearchController(searchResultsController: nil)
    
    @Binding var text: String
    let hide : Bool
    let placeholder : String
    let cancelButton : Bool
    let autocapitalization : UITextAutocapitalizationType
    
    init(text: Binding<String>, hide: Bool, placeholder: String, cancelButton: Bool, autocapitalization: UITextAutocapitalizationType) {
        
        self._text = text
        self.hide = hide
        self.placeholder = placeholder
        self.cancelButton = cancelButton
        self.autocapitalization = autocapitalization
        
        super.init()
        
        
        self.searchController.obscuresBackgroundDuringPresentation = false
        self.searchController.searchResultsUpdater = self
        
        self.searchController.hidesNavigationBarDuringPresentation = hide
        self.searchController.automaticallyShowsCancelButton = cancelButton
        self.searchController.searchBar.placeholder = placeholder
        self.searchController.searchBar.autocapitalizationType = autocapitalization
        
    }
}

extension SearchBar: UISearchResultsUpdating {
   
    func updateSearchResults(for searchController: UISearchController) {
        
        // Publish search bar text changes.
        if let searchBarText = searchController.searchBar.text {
            self.text = searchBarText
        }
    }
}

struct SearchBarModifier: ViewModifier {
    
    let searchBar: SearchBar
    
    func body(content: Content) -> some View {
        content
            .overlay(
                ViewControllerResolver { viewController in
                    viewController.navigationItem.searchController = self.searchBar.searchController
                }
                    .frame(width: 0, height: 0)
            )
    }
}

extension View {
    
    func add(_ searchBar: SearchBar) -> some View {
        return self.modifier(SearchBarModifier(searchBar: searchBar))
    }
    
}
import SwiftUI

final class ViewControllerResolver: UIViewControllerRepresentable {
    
    let onResolve: (UIViewController) -> Void
        
    init(onResolve: @escaping (UIViewController) -> Void) {
        self.onResolve = onResolve
    }
    
    func makeUIViewController(context: Context) -> ParentResolverViewController {
        ParentResolverViewController(onResolve: onResolve)
    }
    
    func updateUIViewController(_ uiViewController: ParentResolverViewController, context: Context) { }
}

class ParentResolverViewController: UIViewController {
    
    let onResolve: (UIViewController) -> Void
    
    init(onResolve: @escaping (UIViewController) -> Void) {
        self.onResolve = onResolve
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("Use init(onResolve:) to instantiate ParentResolverViewController.")
    }
        
    override func didMove(toParent parent: UIViewController?) {
        super.didMove(toParent: parent)
        if let parent = parent {
            onResolve(parent)
        }
    }
    
    override func viewDidAppear(_ animated: Bool) {
        
            self.parent?.navigationItem.hidesSearchBarWhenScrolling = false
            self.parent?.definesPresentationContext = true
            self.parent?.navigationController?.navigationBar.sizeToFit()
        
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        
            self.parent?.navigationItem.hidesSearchBarWhenScrolling = false
            self.parent?.definesPresentationContext = true
            self.parent?.navigationController?.navigationBar.sizeToFit()
        
    }


}

在屏幕上显示
搜索栏之前,在滚动时设置
隐藏搜索栏
属性。这可以在
视图中将出现
中完成,或者如下例所示:

struct SearchBarModifier: ViewModifier {
    let searchBar: SearchBar

    func body(content: Content) -> some View {
        content
            .overlay(
                ViewControllerResolver { viewController in
                    viewController.navigationItem.searchController = self.searchBar.searchController
                    viewController.navigationItem.hidesSearchBarWhenScrolling = false
                }
                    .frame(width: 0, height: 0)
            )
    }
}

在屏幕上显示
搜索栏之前,设置
hidesearchbarwhenscrolling
属性。这可以在
视图中将出现
中完成,或者如下例所示:

struct SearchBarModifier: ViewModifier {
    let searchBar: SearchBar

    func body(content: Content) -> some View {
        content
            .overlay(
                ViewControllerResolver { viewController in
                    viewController.navigationItem.searchController = self.searchBar.searchController
                    viewController.navigationItem.hidesSearchBarWhenScrolling = false
                }
                    .frame(width: 0, height: 0)
            )
    }
}

仅仅发布代码而不进行底层解释并不总是有帮助的。你的代码到底是如何回答这个问题的?仅仅发布代码而不做任何解释并不总是有帮助的。你的代码是如何回答这个问题的?