您好我正在創建一個用于存盤大學資料和學生資料的應用程式,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)
}
}}
uj5u.com熱心網友回復:
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 僅用于過濾結果并重繪 過濾串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405053.html
標籤:
