尝试使用searchdisplayController在表中搜索.配置数据过滤,搜索对话框有效.现在我想使用方法prepareForSegue将当前值indexPath发送到新的UIViewController:
import UIKit import CoreData class MainTableViewController: UITableViewController { var results:AddrBook[]=[] var searchResults:AddrBook[]=[] init(style: UITableViewStyle) { super.init(style: style) } init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } override func viewDidAppear(animated: Bool) { let request = NSFetchRequest(entityName: "Person") request.returnsObjectsAsFaults = false let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) let context:NSManagedobjectContext = appDelegate.managedobjectContext results = context.executeFetchRequest(request,error: nil) as AddrBook[] self.tableView.reloadData() } override func numberOfSectionsInTableView(tableView: UITableView?) -> Int { return 1 } override func tableView(tableView: UITableView!,numberOfRowsInSection section: Int) -> Int { if tableView == self.searchdisplayController.searchResultsTableView { return searchResults.count } else { return results.count } } override func tableView(tableView: UITableView!,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell! { var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell if !cell { cell = UITableViewCell(style: UITableViewCellStyle.Value1,reuseIdentifier: "Cell") } if tableView == self.searchdisplayController.searchResultsTableView { cell!.textLabel.text = searchResults[indexPath.row].lastname + " " + searchResults[indexPath.row].firstname cell!.detailTextLabel.text = searchResults[indexPath.row].phonenumber } else { cell!.textLabel.text = results[indexPath.row].lastname + " " + results[indexPath.row].firstname cell!.detailTextLabel.text = results[indexPath.row].phonenumber } return cell } override func tableView(tableView: UITableView!,didSelectRowAtIndexPath indexPath: NSIndexPath!) { if tableView == self.searchdisplayController.searchResultsTableView { self.performSegueWithIdentifier("editPerson",sender : self) } } override func prepareForSegue(segue: UIStoryboardSegue!,sender: AnyObject?) { var indexPath = NSIndexPath() if self.tableView == self.searchdisplayController.searchResultsTableView { NSLog("Trying recieve indexPath from Search") indexPath = self.searchdisplayController.searchResultsTableView.indexPathForSelectedRow() NSLog("indexPath from Search") } else { indexPath = self.tableView.indexPathForSelectedRow() NSLog("IndexPath from main table") } let destViewController:DetailViewController! = segue.destinationViewController as DetailViewController if segue.identifier == "editPerson" { destViewController.receivedPerson = results destViewController.indexPath = indexPath NSLog("Selected person ID: \(results[indexPath.row].idperson)") } } override func tableView(tableView: UITableView?,canEditRowAtIndexPath indexPath: NSIndexPath?) -> Bool { return true } override func tableView(tableView: UITableView!,commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath!) { let request = NSFetchRequest(entityName: "Person") request.returnsObjectsAsFaults = false let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) let context:NSManagedobjectContext = appDelegate.managedobjectContext if editingStyle == .Delete { context.deleteObject(results[indexPath.row]) context.save(nil) } results.removeAtIndex(indexPath.row) tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: .Fade) } func filterContentForSearchText (searchText: String) { searchResults = results.filter{ ($0.lastname as Nsstring).localizedCaseInsensitiveContainsstring("\(searchText)") } } func searchdisplayController(controller: UISearchdisplayController!,shouldReloadTableForSearchString searchString: String!) -> Bool { self.filterContentForSearchText (searchString) return true }
}
在函数prepareForSegue条件中,self.tableView == self.searchdisplayController.searchResultsTableView未实现.
始终指定indexPath = self.tableView.indexPathForSelectedRow()而不是indexPath = self.searchdisplayController.searchResultsTableView.indexPathForSelectedRow().如果在搜索结果中选择行,则会导致错误.
链接到DropBox上的项目:https://www.dropbox.com/s/bqv46nkoa4s3ibg/lesson-12-2-swift%203.zip
self.tableView是主表视图,所以条件
if self.tableView == self.searchdisplayController.searchResultsTableView
永远不会是真的.但您可以检查搜索是否有效:
if self.searchdisplayController.active { // index path from search table ... } else { // index path from main table ... }
原文地址:https://www.jb51.cc/swift/319843.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。