[英]Not Showing Search results in Tableview From Coredata?
您好,我正在創建一個用於存儲大學數據和學生數據的應用程序,Crud 操作與 Coredata 中的關系完美配合,我在使用搜索欄從 tableview 搜索數據時遇到問題。 我正在以編程方式創建 UISearch 欄。 我也有一些人做了一些研究,但對我沒有任何幫助。 誰能告訴我為什么會這樣。 我也進行了調試......在這條線上我發現了問題。
for name in collegeList{
if((name.collegeName?.lowercased().contains(searchText.lowercased())) !=
nil)
{
filteredData.append(name)
}
}
這是我的詳細信息:-
import UIKit
import TransitionButton
import CoreData
class CollegeListViewController:
CustomTransitionViewController,UISearchResultsUpdating,
UISearchBarDelegate,UISearchControllerDelegate{
@IBOutlet weak var collegeTableView: UITableView!
var collegeList = [College]()
var filteredData = [College]()
var searching = false
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
collegeTableView.delegate = self
collegeTableView.dataSource = self
//collegeList = DataBaseHelper.shared.fetchCollegeList()
}
override func viewWillAppear(_ animated: Bool) {
ConfigurationSearchController()
collegeList = DataBaseHelper.shared.fetchCollegeList()
DispatchQueue.main.async {
self.collegeTableView.reloadData()
}
}
@IBAction func collegeAddDataButtonTapped(_ sender: UIBarButtonItem) {
let formVC : CollegeFormViewController =
self.storyboard?.instantiateViewController(withIdentifier: "CollegeFormViewController") as! CollegeFormViewController
self.navigationController?.pushViewController(formVC, animated: true)
}
func ConfigurationSearchController(){
searchController.searchBar.delegate = self
searchController.searchResultsUpdater = self
searchController.loadViewIfNeeded()
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.enablesReturnKeyAutomatically = false
searchController.searchBar.returnKeyType = UIReturnKeyType.done
self.navigationItem.searchController = searchController
self.navigationItem.hidesSearchBarWhenScrolling = false
definesPresentationContext = true
searchController.searchBar.placeholder = "Search"
}
func updateSearchResults(for searchController: UISearchController) {
let searchText = searchController.searchBar.text!
if !searchText.isEmpty{
searching = true
filteredData.removeAll()
//guard let college = collegeList else { return }
for name in collegeList{
if ((name.collegeName?.lowercased().contains(searchText.lowercased())) !=
nil)
{
filteredData.append(name)
}
}
} else {
searching = true
filteredData.removeAll()
filteredData = collegeList
}
collegeTableView.reloadData()
}
}
extension CollegeListViewController : UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
if searching{
return filteredData.count
} else {
return collegeList.count
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let cell = collegeTableView.dequeueReusableCell(withIdentifier: "collegeCell")
as! CollegeListTableViewCell
let row = collegeList[indexPath.row]
if searching {
let filter = filteredData[indexPath.row]
cell.lblAddress.text = filter.collegeAddress
cell.lblCollegeName.text = filter.collegeName
cell.lblCity.text = filter.collegeCity
cell.lblUniversity.text = filter.collegeUniversity
} else {
cell.lblAddress.text = row.collegeAddress
cell.lblCollegeName.text = row.collegeName
cell.lblCity.text = row.collegeCity
cell.lblUniversity.text = row.collegeUniversity
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
這是我的 Coredata 函數詳細信息:-
import Foundation
import CoreData
import UIKit
class DataBaseHelper: NSObject {
static let shared = DataBaseHelper()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
func saveData(object : [String : String]) {
let college = NSEntityDescription.insertNewObject(forEntityName: "College", into: context) as! College
college.collegeName = object["collegeName"]
college.collegeAddress = object["collegeAddress"]
college.collegeCity = object["collegeCity"]
college.collegeUniversity = object["collegeUniversity"]
do {
try context.save()
} catch let error {
print(error.localizedDescription)
}
}
func fetchCollegeList()-> [College] {
var college = [College]()
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "College")
do {
college = try context.fetch(fetchRequest) as! [College]
} catch let error {
print(error.localizedDescription)
}
return college
}
func deleteData(index:Int) -> [College] {
var college = fetchCollegeList()
context.delete(college[index])
college.remove(at: index)
do {
try context.save()
} catch {
print(error.localizedDescription)
}
return college
}
func editData(object:[String: String], index: Int) {
let college = fetchCollegeList()
college[index].collegeName = object["collegeName"]
college[index].collegeUniversity = object["collegeUniversity"]
college[index].collegeAddress = object["collegeAddress"]
college[index].collegeAddress = object["collegeAddress"]
do {
try context.save()
} catch {
print(error.localizedDescription)
}
}}
class CollegeListViewController:
CustomTransitionViewController,UISearchResultsUpdating,
UISearchBarDelegate,UISearchControllerDelegate{
@IBOutlet weak var collegeTableView: UITableView!
var collegeList = [College]()
var filteredData = [College]()
let searchController = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
collegeTableView.delegate = self
collegeTableView.dataSource = self
collegeList = DataBaseHelper.shared.fetchCollegeList()
filteredData = collegeList
}
override func viewWillAppear(_ animated: Bool) {
ConfigurationSearchController()
collegeTableView.reloadData()
}
@IBAction func collegeAddDataButtonTapped(_ sender: UIBarButtonItem) {
let formVC : CollegeFormViewController =
self.storyboard?.instantiateViewController(withIdentifier: "CollegeFormViewController") as! CollegeFormViewController
self.navigationController?.pushViewController(formVC, animated: true)
}
func ConfigurationSearchController(){
searchController.searchBar.delegate = self
searchController.searchResultsUpdater = self
searchController.loadViewIfNeeded()
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.enablesReturnKeyAutomatically = false
searchController.searchBar.returnKeyType = UIReturnKeyType.done
self.navigationItem.searchController = searchController
self.navigationItem.hidesSearchBarWhenScrolling = false
definesPresentationContext = true
searchController.searchBar.placeholder = "Search"
}
func updateSearchResults(for searchController: UISearchController) {
let searchText = searchController.searchBar.text!
guard !searchText.isEmpty else {
filteredData = collegeList
return
}
filteredData = collegeList.filter({ $0.collegeName.lowercased().contains(searchText.lowercased() )})
collegeTableView.reloadData()
}
}
擴展 CollegeListViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let cell = collegeTableView.dequeueReusableCell(withIdentifier: "collegeCell")
as! CollegeListTableViewCell
let filter = filteredData[indexPath.row]
cell.lblAddress.text = filter.collegeAddress
cell.lblCollegeName.text = filter.collegeName
cell.lblCity.text = filter.collegeCity
cell.lblUniversity.text = filter.collegeUniversity
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
我認為現在應該這樣做。 基本上你不需要searching
變量。 您只需將集合上的過濾列表用於所有內容,並保留collegeList 僅用於過濾結果並刷新過濾列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.