尝试使用进行表格搜索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 ...
}
CoreData-CustomObject 能让用户学会使用 CustomObject 创建和加载数据。
将 coredata 数据存储到SQLite数据库中,并从数据库中读取数据。 [Code4App.com]
TLDR版本:我的应用程序如何知道设备a上的CoreData对象、设备B上的CoreData对象和CloudKit中的CKRecord都是相同的记录? 详细版本: 我正在开发一个应用程序,它在本地使用CoreData和CloudKit来实现设备间的同步。我不明白添加多个设备后,CoreData关系和CloudKit引用应该如何协同工作。 2)当您创建CloudKit记录时,您可以为它分配一个记录名
问题内容: 我正在用Swift编写iOS游戏,但我想在结尾加上高分标签。我认为保存功能是正确的,但负载之一就是给我带来麻烦的功能。我已经创建了一个实体(“ BestScores”)和属性(“ classicBestScoreTF”): 要保存最高分: 它不起作用:(请帮忙! 问题答案: 保存数据: 加载数据中:
我试图理解CoreData中的backgroundContext的概念。虽然我读了几篇关于它的文章,但我仍然不确定它的目的。 我有一个应用程序使用核心数据,允许用户创建,更新或删除记录。用户还可以获取他添加的数据。我想确保如果有很多记录,在获取数据时不会影响UI的流。 所以我研究了一些背景上下文。我根据自己理解的内容执行了以下操作。但我不确定这是否是一个正确的解决办法。我的想法是--如果我进入背景
我有一个视图控制器,其中包含一个表视图,所以我想问我应该把表视图数据源和委托放在哪里,它应该是一个外部对象,或者如果我们说VIPER模式,我可以把它写在我的视图控制器中。 Presenter包含interactor,在showSongs方法中,我从interactor请求一些数据,比如:self.interactor.loadSongs() 当歌曲准备好返回到view controller时,我再