繁体   English   中英

如何使用 onCommit - SwiftUI

[英]How to use onCommit - SwiftUI

我使用纯 SwiftUI 构建了一个搜索栏,它接受输入并使用.onCommit 查询电影数据库 API 并通过 SearchViewModel 中的 @Published 将数据发布到 SearchView。

我从 API 取回数据(我可以通过打印语句看到这一点),但 SearchView 从不刷新以显示结果。 我在下面包含了我的代码。

搜索视图

import SwiftUI

struct SearchView: View {
    
    @ObservedObject var searchVM = SearchViewModel()
    
    @State private var searchText = "Star+trek"
    
    var body: some View {
        
        NavigationView {
            
            VStack {
                
                SearchBarView(text: $searchText)
                
                List {
                    
                    ForEach(searchVM.searchedMovies, id: \.id) { movie in
                        
                        NavigationLink(destination: MovieDetailView(movie: movie)) {
                            
                            MovielistRowView(movies: movie)
                        }
                        
                    }
                }
            }
            .navigationBarTitle("Search")
        }
    }
}

搜索栏视图

import SwiftUI

struct SearchBarView: View {
    
    @ObservedObject var searchVM = SearchViewModel()
    
    @Binding var text: String
    
    @State private var isEditing = false
    
     var body: some View {
        
            HStack {
     
                TextField("Search for a movie", text: $text,
                          onCommit: {
                            self.searchVM.fetchMovies(movie: self.text)
                })
                    .padding(7)
                    .padding(.horizontal, 25)
                    .background(Color(.systemGray6))
                    .cornerRadius(8)
                
                    
                    // Add search icon and cross icon
                    .overlay(
                        HStack {
                            Image(systemName: "magnifyingglass")
                                .foregroundColor(.gray)
                                .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                                .padding(.leading, 8)
                     
                            if isEditing {
                                Button(action: {
                                    self.text = ""
                                }) {
                                    Image(systemName: "multiply.circle.fill")
                                        .foregroundColor(.gray)
                                        .padding(.trailing, 8)
                                }
                            }
                        }
                    )
                    .padding(.horizontal, 10)
                    .onTapGesture {
                        self.isEditing = true
                    }
     
                if isEditing {
                    Button(action: {
                        self.isEditing = false
                        self.text = ""
                        
                        // Dismiss the keyboard
                        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
     
                    }) {
                        Text("Cancel")
                        
                    }
                    .padding(.trailing, 10)
                    .transition(.move(edge: .trailing))
                    .animation(.default)
                }
            }
        }
    }

搜索视图模型

import Foundation

class SearchViewModel: ObservableObject {
    
    @Published var searchedMovies = [Movie]()
    
    private var fetchedMovies = [MovieList]()
    
    func fetchMovies(movie: String) {
        
        WebService().searchForMovie(movie: movie) { movie in
            
            if let movie = movie {
                
                self.fetchedMovies.append(movie)
                
                for movie in movie.movies {
                    
                    self.searchedMovies.append(movie)
                }
            }
        }
    }
}

任何帮助将不胜感激!

问题是您使用了两个不同的 SearchViewModel 实例。 您在 SearchView 中对其进行初始化,然后在 SearchBarView 中再次执行此操作。

我建议您将 SearchViewModel 作为参数传递给 SearcBarView,以便当您的 @Published 变量 searchedMovies 更新时,SearchView 会捕获这些更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM